基本使用
配置
設置數據庫配置參數,創建一個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': ''
}
}
配置讀寫分離數據庫
有的情況下我們需要配置讀寫分離數據庫,一個數據庫用來查詢,另一個數據庫用來插入、更新和刪除。Orator可以很容易的實現。
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。數據庫的database、user等配置都是共用的,如果需要單獨配置,則配置到自己的字典里面和host一樣。
執行查詢
執行一個查詢操作
results = db.select('select * from users where id = ?', [1])
這個查詢語句的結果返回的一個list。
執行一個插入操作
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')
這一個操作返回刪除的記錄行數。
執行所有的操作
db.statement('drop table users')
數據庫事務
執行一個數據庫的事務,我們可以用以下的這種方式。
with db.transaction():
db.table('users').update({votes: 1})
db.table('posts').delete()
如果執行事務過程中有任何異常拋出,都將回滾。
還可以這樣開啟事務
db.begin_transaction()
回滾操作
db.rollback()
提交事務
db.commit()
使用數據庫連接
當我們使用多個數據庫連接的時候,可以指定其中一個連接。
users = db.connection('foo').table('users').get()
獲取一個數據庫連接實例
db.connection().get_connection()
重新連接建立一個連接
db.reconnect('foo')
關閉一個連接
db.disconnect('foo')
查詢日志
Orator可以配置查詢和執行的日志記錄。通過設置log_queries
為true
開啟。
config = {
'mysql': {
'driver': 'mysql',
'host': 'localhost',
'database': 'database',
'username': 'root',
'password': '',
'prefix': '',
'log_queries': True
}
}
也可以這樣設置
db.connection().enable_query_log()
現在,這個日志將在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
自定義日志
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)