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驅動有兩個pymysql和MySQLdb,但是從源碼中可以看到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