zoukankan      html  css  js  c++  java
  • python ORM 模块peewee(一): 建立数据库对象

    1. 单连接模式

    peewee通过Database类及其子类来建立数据库对象,目前peewee支持的数据库有Postgres, MySQL,MySQL,SQLite 以及BerkeleyDB。这里我们仅通过MySQL来进行了解,如果对其他数据库类型的相关内容感兴趣可以参见官方文档
    mysql通过MySQLDatabase类来初始化数据库对象,这是Database的一个子类,继承了父类的构造函数:

    class Database(database[, threadlocals=True[, autocommit=True[, fields=None[, ops=None[, autorollback=False[, use_speedups=True[, **connect_kwargs]]]]]]])
    

    这里
    database指数据库的名称, 字符串格式
    threadlocals指 是否用本地线程保存连接
    autocommit 自动提交
    fields 添加orm中的数据类型到数据库中数据类型的映射
    ops 定义操作符映射
    autorollback 执行数据库请求时出错则自动回滚
    use_speedups 用Cpython speedup模块来加速某些queries
    connect_kwargs 数据库驱动中初始化所用的key
    另外, MySQLDatabase类还添加了以下选项:
    commit_select = True
    compound_operations = ['UNION']
    for_update = True
    subquery_delete_same_table = False
    peewee中的mysql驱动有两个pymysqlMySQLdb,但是从源码中可以看到peewee是更倾向于使用MySQLdb的,只有当import MySQLdb as mysql报错后才会开始引用import pymysql as mysql。这里举例介绍一些常用的connect_kwargs,如果需要详细了解,可以参见源程序中的connections.connection类,里面的注释已经写得非常清晰了。例如:

    #! /usr/bin/env python
    # coding: utf-8
    
    from peewee import *
    
    db = MySQLDatabase(
        database = 'test',# string
        passwd = 'test', # string
        user = 'test', # string
        host = 'localhost', # string
        port = 3306, # int, 可不写
    )
    

    官方文档中建议使用数据库前先调用其db.connect()函数,这个函数功能上并不是必须的,但是可以帮助定位错误。
    实例化本地数据库还有另外一种方法: mysql://user:passwd@ip:port/my_db这在Connecting using a Database URL中也有介绍

    2 实时数据库实例化

    Database类中的database字段可以先设置为None, 数据库的实例化可以在随后得到数据可靠名字之后,具体操作如下:

    db = MySQLDatabase(None)
    
    # 此时若是调用db.connect()则会报错
    
    # 数据库的名字
    db_name = 'mydb'
    db.init(
        database = 'mydb',
        host = 'test',
        user = 'test',
        passwd = 'test'
    )
    

    3 动态实例化

    peewee甚至允许数据库的动态实例化,这里用到了代理模式:

    # 创建数据库的代理
    db_proxy = Proxy()  
    
    # 使用代理数据库创建表
    class BaseModel(Model):
        class Meta:
            database = db_proxy  
    
    class User(BaseModel):
        username = CharField()
    
    # 根据配置条件来选择不同的数据库
    if app.config['DEBUG']:
        db= SqliteDatabase('local.db')
    elif app.config['TESTING']:
        db= SqliteDatabase(':memory:')
    else:
        db= PostgresqlDatabase('mega_production_db')
    
    # 通过代理来根据配置条件将选取的数据库初始化
    database_proxy.initialize(db)
    

    4 连接池

    peewee为通过一个'PooledDatabase'基类Mysql, sqlite 和Postgres 提供了连接池的功能。这个基类的定义如下:
    class PooledDatabase(database[, max_connections=20[, stale_timeout=None[, **kwargs]]])
    其中:
    max_connections 定义了最大连接数
    stale_timeout 定义了每个连接最大可用时间
    具体它的MySQL子类为:class PooledMySQLDatabase

  • 相关阅读:
    Python3 日期与时间戳相互转换
    PHP 二维数组排序保持键名不变
    C# Command命令(行为型模式)+队列 实现事务,带异步命令重试机制和生命周期
    领域驱动系列五模型驱动设计的构造块
    领域驱动系列四之模型驱动
    领域驱动系列三
    领域驱动系列二策略模式的应用
    领域驱动系列一基本概念介绍
    Redis学习系列七分布式锁
    Redis学习系列六ZSet(有序列表)及Redis数据结构的过期
  • 原文地址:https://www.cnblogs.com/noway-neway/p/5272688.html
Copyright © 2011-2022 走看看