【Python百日进阶-Web开发-Peewee】Day244 - 数据库 Postgresql、CockroachDB

六、数据库

http://docs.peewee-orm.com/en/latest/peewee/database.html
PeeweeDatabase对象表示与数据库的连接。该类Database使用打开数据库连接所需的所有信息进行实例化,然后可用于:

  • 打开和关闭连接。
  • 执行查询。
  • 管理事务(和保存点)。
  • 内省表、列、索引和约束。
    Peewee 支持 SQLite、MySQL 和 Postgres。每个数据库类都提供了一些基本的、特定于数据库的配置选项。
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://...')

有关数据库扩展的更多信息,请参见:

  • Postgresql 扩展
  • SQLite 扩展
  • Cockroach数据库
  • Sqlcipher 后端(加密的 SQLite 数据库)。
  • apsw,一个高级的 sqlite 驱动程序
  • SqliteQ

6.1 初始化数据库

初始化方法需要数据库的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')

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

6.2 使用 Postgresql

要连接到 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 特定的功能,例如:

  • 数组
  • HStore
  • JSON
  • 服务器端游标
  • 更多!
    如果您想使用这些很棒的功能,请使用 PostgresqlExtDatabase模块中的playhouse.postgres_ext:
from playhouse.postgres_ext import PostgresqlExtDatabase

psql_db = PostgresqlExtDatabase('my_database', user='postgres')

6.2.1 隔离级别

从 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)

6.3 使用 CockroachDB

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('huey@example.com')

笔记

如果在给定的cockroachdb.ExceededMaxAttempts尝试次数后无法提交事务,则会引发异常。如果 SQL
格式错误、违反约束等,则该函数将向调用者引发异常。

有关更多信息,请参阅:

  • CRDB 扩展文档
  • 使用 CockroachDB 进行 SSL 配置
  • 数组(特定于 postgres,但适用于 CRDB)
  • JSON(特定于 postgres,但适用于 CRDB)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岳涛@心馨电脑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值