基础使用
配置
首先所需要做的是填入数据库连接配置并将其传递给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': ''
}
}
值得注意的是,两个新增的键 read
和 write
被添加到了配置字典中,且这两个键所对应的字典都包含了同一个键 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')
update
和delete
语句返回受操作影响的行数。
运行一般性声明
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
上面的这些日志消息是为 MySQL 和 PostgreSQL 连接记录的那些消息,这些消息支持显示发送到数据库的完整请求。对于 SQLite 连接,格式如下:
Executed ('SELECT COUNT(*) AS aggregate FROM "users"', []) in 0.12ms
导入日志
记录器发送的每个日志记录都带有query
和lapsed_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)
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。