今天要介紹的這個Python第三方庫非常厲害,完美操作各種數據庫。名字叫 records, 在網上很少有這個庫的相關資料,但是在開源社區可是很火熱的哦。如果這還不能打消你的顧慮,再告訴你一件事:如果你用 python 編程,你一定聽過 requests, 這兩個庫是同一個作者寫的。
一、快速使用
使用步驟:
1、連接數據庫,返回 db 數據庫對象
2、db 對象執行 sql 語句
# pip install records 安裝
import records
# 獲取數據庫
db = records.Database('MySQL+pymysql://root:@localhost:3306/dev01_git')
# 查詢
rows = db.query('select * from lemon_user')
獲取數據庫的格式是標準的 URL 格式,如果使用的不是 mysql 數據庫,只需要換掉數據庫類型就可以了:
二、創建表
# 連接數據庫
db = records.Database('mysql+pymysql://root:@localhost:3306/dev01_git')
# 創建表
sql_create_table = """CREATE TABLE IF NOT EXISTS lemon_user (
name varchar(20),
age int
) DEFAULT CHARSET=utf8 ;"""
db.query(sql_create_table)
三、插入單條數據
records 支持使用 :variable 定義變量,通過參數傳入完成動態傳值,在需要動態加載數據的時候非常有用:user = {"name": "yuze5", "age": 20}
db.query('INSERT INTO lemon_user(name,age) values (:name, :age)', **user)
四、插入多條數據
sql 語句在執行多條數據操作的時候非常不方便,尤其是當值還是變化的時候。 records 提供的 bulk_query 方法能快捷的插入和更新多條數據:users = [
{"name":"yuze", "age": 13},
{"name":"yuze2", "age": 15},
{"name":"yuze3", "age": 16}
]
db.bulk_query('INSERT INTO lemon_user(name,age) values (:name, :age)', users)
五、數據查詢
查詢到數據以后,可以通過 all() 方法獲取所有的記錄,支持 3 種類型。- 默認是自己封裝的 RecordCollection 對象,
- 也可以通過 as_dict=True 參數轉成字典形式,
- 可以通過 as_ordereddict=True 轉成排序字典形式
rows = db.query('SELECT * FROM lemon_user;')
# 得到所有數據
print(rows.all())
# 字典形式展示
print(rows.all(as_dict=True))
# 獲取第一個
print(rows.first())
# 以字典形式獲取第一個
print(rows.first(as_dict=True))
# 排序字典
print(rows.first(as_ordereddict=True))
# 查詢唯一的一個
print(rows.one())
六、簡潔的數據庫事務支持
數據庫事務是經常需要使用到的數據庫操作,他通常是為了保持數據原子性和一致性。
比如一個轉賬的數據庫操作:
1、從 yuze 賬號中讀取余額 , 2、對 yuze 賬號余額減去轉賬 - 400 3、從 chaoge 賬號中把余額讀出來 4、對 chaoge 賬號做加法操作(+400)。
我們必須保證這 4 步同時執行成功,要么同時都不成功。如果前 2 步已經執行成功,但是到第 3 步發生了錯誤導致后面都不能執行,就會出現問題:yuze 的賬號被扣了錢,但是 chaoge 的賬號卻沒有加錢。
通過數據庫事務就能避免這種情況。
with db.transaction() as tx:
user = {"name": "yuze9", "age": 20}
tx.query('INSERT INTO lemon_user(name,age) values (:name, :age)', **user)
# 下面是錯誤的 sql 語句,有錯誤,則上面的 sql 語句不會成功執行。
tx.query('sof')
七、數據導出為 json
數據庫數據得到以后還需要進一步的操作,比如保存起來。
rows = db.query('SELECT * FROM lemon_user;')
json_rows = rows.export('yaml')
print(json_rows)
八、數據導出到 Excel 文件
最常用的是如果需要各種各樣的報表,需要放到 excel 文件中保存起來。
rows = db.query('SELECT * FROM lemon_user;')
with open('users.xlsx', 'wb') as f:
f.write(rows.export('xlsx'))
導出的數據效果:
九、總結
- records 支持多種不同的數據庫;
- records 的方法非常簡單和統一,不像 pymysql 還需要記住如游標對象這樣的底層信息;
- 自動實現上下文管理器,不需要關注鏈接狀態;
- 支持 :variable 方言,以安全的形式進行動態參數傳遞,防止 sql 語句不規范導致的安全問題;
- 支持數據庫事務,保持數據的原子性和一致性;
- 輕松導出為 json, yaml, xls, xlsx, pandas, html 等多種數據格式。
- 源碼非常簡單,你一定看得懂。