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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM