本章节介绍了如何使用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
,user
和 password
。这些都不是标准的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')
有关可用参数,请参阅数据库驱动文档:
未完待续