建立数据库对象
為什么80%的碼農都做不了架構師?>>> ??
1. 單連接模式
peewee通過Database類及其子類來建立數據庫對象,目前peewee支持的數據庫有Postgres, MySQL,MySQL,SQLite 以及BerkeleyDB。這里我們僅通過MySQL來進行了解,如果對其他數據庫類型的相關內容感興趣可以參見官方文檔。
mysql通過MySQLDatabase類來初始化數據庫對象,這是Database的一個子類,繼承了父類的構造函數:
這里
database指數據庫的名稱, 字符串格式
threadlocals指 是否用本地線程保存連接
autocommit 自動提交
fields 添加orm中的數據類型到數據庫中數據類型的映射
ops 定義操作符映射
autorollback 執行數據庫請求時出錯則自動回滾
use_speedups 用Cpython speedup模塊來加速某些queries
connect_kwargs 數據庫驅動中初始化所用的key
另外, MySQLDatabase類還添加了以下選項:
peewee中的mysql驅動有兩個pymysql和MySQLdb,但是從源碼中可以看到peewee是更傾向于使用MySQLdb的,只有當import MySQLdb as mysql報錯后才會開始引用import pymysql as mysql。
這里舉例介紹一些常用的connect_kwargs,如果需要詳細了解,可以參見源程序中的connections.connection類,里面的注釋已經寫得非常清晰了。例如:
#! /usr/bin/python # coding: utf-8from peewee import *db = MySQLDatabase(database = 'test',# stringpasswd = 'test', # stringuser = 'test', # stringhost = 'localhost', # stringport = 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
轉載于:https://my.oschina.net/yehun/blog/870950
總結
- 上一篇: python实体类dict to obj
- 下一篇: 测试你的前端代码 - part3(端到端