Peewee中文文档【六】:数据库管理

本章节介绍了如何使用Peewee执行与数据库相关的典型任务。在本文档中,我们将使用以下示例模型:

from peewee import *

class User(Model):
    username = CharField(unique=True)

class Tweet(Model):
    user = ForeignKeyField(User, related_name='tweets')
    message = TextField()
    created_date = DateTimeField(default=datetime.datetime.now)
    is_published = BooleanField(default=True)

创建数据库连接和数据库表

虽然在使用数据库之前明确的连接它不是必须的,但明确的管理数据库连接是很好的做法。这样如果连接失败,则可以在连接步骤期间捕获异常,而不是稍候执行查询的任意时间。此外,如果您使用连接池,实际上有必要调用connect()和close()来确保连接被正常回收。

对于web应用,您通常会在启动请求时打开连接,并在发送响应时将其关闭:

database = SqliteDatabase('my_app.db')

def before_request_handler():
    database.connect()

def after_request_handler():
    database.close()

备注
有关配置多个流程web框架的连接钩子的示例,请参阅添加请求钩子部分。

有关高级连接管理技术,请参阅高级连接管理部分。


为了将此数据库同您的模型一起使用,在内部Meta类设置database属性:

class MyModel(Model):
    some_field = CharField()

    class Meta:
        database = database

好习惯 :定义一个基础模型指明你想用的数据库对象,然后所有你的模型都继承它:

 database = SqliteDatabase('my_app.db')

class BaseModel(Model):
    class Meta:
        database = database

class User(BaseModel):
    username = CharField()

class Tweet(BaseModel):
    user = ForeignKeyField(User, related_name='tweets')
    message = TextField()
    # etc, etc

备注
请记得在你的模型类里指定数据库,否则peewee将会使用默认名为’peewee.db’的数据库


Vendor-specific参数

部分数据库驱动在被初始化的时候可以接收特殊参数。Peewee会传递一些无法识别的参数给数据库驱动,而不是容纳所有的这些参数。
例如,通常在使用Postgresql创建连接时需要指定 host , userpassword
。这些都不是标准的peewee数据库参数,所以在创建连接时它们将会被传递给 psycopg2 :

db = PostgresqlDatabase(
    'database_name',  # peewee需要的参数.
    user='postgres',  # 将会直接传递给psycopg2.
    password='secret',  # 同上.
    host='db.mysite.com',  # 同上.
)

另外的一个例子,pymysql数据库驱动可以接收 charset 参数,但是它不是标准的peewee数据库参数。为设置这个值,只需要将 charset 同其他值一起传递:

db = MySQLDatabase('database_name', user='www-data',charset='utf8mb4')

有关可用参数,请参阅数据库驱动文档:

未完待续