http://docs.peewee-orm.com/en/latest/peewee/database.html
PeeweeDatabase对象表示与数据库的连接。该类Database使用打开数据库连接所需的所有信息进行实例化,然后可用于:
from peewee import *
# SQLite database using WAL journal mode and 64MB cache.
sqlite_db = SqliteDatabase('/path/to/app.db', pragmas={
'journal_mode': 'wal',
'cache_size': -1024 * 64})
# Connect to a MySQL database on network.
mysql_db = MySQLDatabase('my_app', user='app', password='db_password',
host='10.1.0.8', port=3306)
# Connect to a Postgres database.
pg_db = PostgresqlDatabase('my_app', user='postgres', password='secret',
host='10.1.0.9', port=5432)
Peewee 通过特定于数据库的扩展模块为 SQLite、Postgres 和 CockroachDB 提供高级支持。要使用扩展功能,请导入适当的特定于数据库的模块并使用提供的数据库类:
from playhouse.sqlite_ext import SqliteExtDatabase
# Use SQLite (will register a REGEXP function and set busy timeout to 3s).
db = SqliteExtDatabase('/path/to/app.db', regexp_function=True, timeout=3,
pragmas={'journal_mode': 'wal'})
from playhouse.postgres_ext import PostgresqlExtDatabase
# Use Postgres (and register hstore extension).
db = PostgresqlExtDatabase('my_app', user='postgres', register_hstore=True)
from playhouse.cockroachdb import CockroachDatabase
# Use CockroachDB.
db = CockroachDatabase('my_app', user='root', port=26257, host='10.1.0.8')
# CockroachDB connections may require a number of parameters, which can
# alternatively be specified using a connection-string.
db = CockroachDatabase('postgresql://...')
有关数据库扩展的更多信息,请参见:
初始化方法需要数据库的Database名称作为第一个参数。后续的关键字参数在建立连接时传递给底层数据库驱动程序,允许您轻松传递特定于供应商的参数。
例如,对于 Postgresql,通常需要在创建连接时指定host, user和。password这些不是标准的 Peewee参数,所以在创建连接时Database会直接传回 :psycopg2
db = PostgresqlDatabase(
'database_name', # Required by Peewee.
user='postgres', # Will be passed directly to psycopg2.
password='secret', # Ditto.
host='db.mysite.com') # Ditto.
作为另一个示例,pymysql驱动程序接受charset不是标准 Peewee参数的Database参数。要设置此值,只需charset与其他值一起传入:
db = MySQLDatabase('database_name', user='www-data', charset='utf8mb4')
有关可用参数,请参阅数据库驱动程序的文档:
要连接到 Postgresql 数据库,我们将使用 PostgresqlDatabase. 第一个参数始终是数据库的名称,之后您可以指定任意psycopg2 参数。
psql_db = PostgresqlDatabase('my_database', user='postgres')
class BaseModel(Model):
"""A base model that will use our Postgresql database"""
class Meta:
database = psql_db
class User(BaseModel):
username = CharField()
Playhouse,Peewee的扩展包含一个Postgresql 扩展模块,它提供了许多 postgres 特定的功能,例如:
from playhouse.postgres_ext import PostgresqlExtDatabase
psql_db = PostgresqlExtDatabase('my_database', user='postgres')
从 Peewee 3.9.7 开始,可以使用以下符号常量将隔离级别指定为初始化参数psycopg2.extensions:
from psycopg2.extensions import ISOLATION_LEVEL_SERIALIZABLE
db = PostgresqlDatabase('my_app', user='postgres', host='db-host',
isolation_level=ISOLATION_LEVEL_SERIALIZABLE)
笔记
在旧版本中,您可以手动设置底层 psycopg2 连接的隔离级别。这可以一次性完成:
db = PostgresqlDatabase(...)
conn = db.connection() # returns current connection.
from psycopg2.extensions import ISOLATION_LEVEL_SERIALIZABLE
conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE)
要在每次创建连接时运行它,子类化并实现_initialize_database()为此目的而设计的钩子:
class SerializedPostgresqlDatabase(PostgresqlDatabase):
def _initialize_connection(self, conn):
conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE)
CockroachDatabase使用以下定义的数据库类连接到 CockroachDB (CRDB) playhouse.cockroachdb:
from playhouse.cockroachdb import CockroachDatabase
db = CockroachDatabase('my_app', user='root', port=26257, host='localhost')
如果您使用Cockroach Cloud,您可能会发现使用连接字符串指定连接参数更容易:
db = CockroachDatabase('postgresql://root:secret@host:26257/defaultdb...')
笔记
CockroachDB 需要psycopg2(postgres) Python 驱动程序。
笔记
CockroachDB 安装和入门指南可以在这里找到:https
/www.cockroachlabs.com/docs/stable/install-cockroachdb.html
CRDB 提供客户端事务重试,可使用特殊的CockroachDatabase.run_transaction()辅助方法获得。此方法接受一个可调用对象,该可调用对象负责执行任何可能需要重试的事务语句。
最简单的例子run_transaction():
def create_user(email):
# Callable that accepts a single argument (the database instance) and
# which is responsible for executing the transactional SQL.
def callback(db_ref):
return User.create(email=email)
return db.run_transaction(callback, max_attempts=10)
huey = create_user('[email protected]')
笔记
如果在给定的cockroachdb.ExceededMaxAttempts尝试次数后无法提交事务,则会引发异常。如果 SQL
格式错误、违反约束等,则该函数将向调用者引发异常。
有关更多信息,请参阅: