基础使用

未匹配的标注

配置

首先所需要做的是填入数据库连接配置并将其传递给DatabaseManager 实例。

from orator import DatabaseManager

config = {
    'mysql': {
        'driver': 'mysql',
        'host': 'localhost',
        'database': 'database',
        'user': 'root',
        'password': '',
        'prefix': ''
    }
}

db = DatabaseManager(config)

如果包含多个数据库连接,可以指定其中一个作为默认配置:

config = {
    'default': 'mysql',
    'mysql': {
        'driver': 'mysql',
        'host': 'localhost',
        'database': 'database',
        'user': 'root',
        'password': '',
        'prefix': ''
    }
}

0.8.0 版本更新:针对 MySQL 和 PostgreSQL 数据库,连接实例默认配置为返回 unicode 字符串。倘若你想遵循先前版本的行为, 只需将 use_unicode 配置选项设置为 False

读写分离

有时,您可能希望将一个数据库连接用于 SELECT 语句,将另一个用于 INSERT,UPDATE 和 DELETE 语句。使用 Orator 可以轻松实现,无论是使用原始查询,查询构建器,还是 ORM,都将始终使用正确的连接。

接下来的例子将展示如何配置读写分离:

config = {
    'mysql': {
        'read': {
            'host': '192.168.1.1'
        },
        'write': {
            'host': '192.168.1.2'
        },
        'driver': 'mysql',
        'database': 'database',
        'username': 'root',
        'password': '',
        'prefix': ''
    }
}

值得注意的是,两个新增的键 readwrite 被添加到了配置字典中,且这两个键所对应的字典都包含了同一个键 host。有关 read 和 write 连接的其它配置项将从 mysql 字典中合并。因此,read 和 write 字典中只需要包含您想要覆盖父字典配置的配置项即可。在上述例子中 192.168.1.1 将作为 连接,192.168.1.2 将作为 连接,而其它配置如数据库证书、前缀、字符集等将共用 mysql 字典中的配置。

查询执行

配置数据库连接后,即可运行查询。

更改版本0.9:以下示例使用qmark语法进行参数绑定。在早期版本的Orator中,您必须使其适应基础后端程序包的参数样式。现在,您可以在配置中将use_qmark设置为True,以允许所有软件包使用qmark语法,从而使Orator完全不依赖数据库。

这将是下一个主要版本的默认设置。

运行选择查询

results = db.select('select * from users where id = ?', [1])

select方法将始终返回结果列表。

运行插入语句

db.insert('insert into users (id, name) values (?, ?)', [1, 'John'])

运行更新语句

db.update('update users set votes = 100 where name = ?', ['John'])

运行删除语句

db.delete('delete from users')

updatedelete语句返回受操作影响的行数。

运行一般性声明

db.statement('drop table users')

数据库事务

要在数据库事务中运行一组操作,可以使用transaction方法,它是上下文管理器:

with db.transaction():
    db.table('users').update({votes: 1})
    db.table('posts').delete()

事务块中引发的任何异常都将导致事务自动回滚。

有时您可能需要自己启动事务:

db.begin_transaction()

您可以使用rollback方法回滚事务:

db.rollback()

您还可以通过commit方法提交事务:

db.commit()

默认情况下,所有基础DBAPI连接都设置为自动提交模式,这意味着您无需在每次操作后显式提交。

访问连接

使用多个连接时,可以通过connection()方法访问它们:

users = db.connection('foo').table('users').get()

您还可以访问原始的基础dbapi连接实例:

db.connection().get_connection()

有时,您可能需要重新连接到给定的数据库:

db.reconnect('foo')

如果需要断开与给定数据库的连接,请使用disconnect方法:

db.disconnect('foo')

查询记录

演说者可以记录所有已执行的查询。默认情况下,此选项是关闭的,以避免不必要的开销,但是如果要激活它,则可以在配置字典中添加log_queries键:

config = {
    'mysql': {
        'driver': 'mysql',
        'host': 'localhost',
        'database': 'database',
        'username': 'root',
        'password': '',
        'prefix': '',
        'log_queries': True
    }
}

或稍后将其激活:

db.connection().enable_query_log()

现在,记录器orator.connection.queries将在 debug 级别记录查询:

Executed SELECT COUNT(*) AS aggregate FROM "users" in 1.18ms

Executed INSERT INTO "users" ("email", "name", "updated_at") VALUES ('foo@bar.com', 'foo', '2015-04-01T22:59:25.810216'::timestamp) RETURNING "id" in 3.6ms

上面的这些日志消息是为 MySQLPostgreSQL 连接记录的那些消息,这些消息支持显示发送到数据库的完整请求。对于 SQLite 连接,格式如下:

Executed ('SELECT COUNT(*) AS aggregate FROM "users"', []) in 0.12ms

导入日志

记录器发送的每个日志记录都带有querylapsed_time关键字,以便您可以自定义日志消息:

import logging

logger = logging.getLogger('orator.connection.queries')
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter(
    'It took %(elapsed_time)sms to execute the query %(query)s'
)

handler = logging.StreamHandler()
handler.setFormatter(formatter)

logger.addHandler(handler)

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:3
讨论数量: 0
发起讨论 只看当前版本


暂无话题~