今天要介紹的這個python第三方庫非常厲害榕栏,完美操作各種數(shù)據(jù)庫。名字叫records珊搀,在網(wǎng)上很少有這個庫的相關(guān)資料,但是在開源社區(qū)可是很火熱的哦尾菇。如果這還不能打消你的顧慮境析,再告訴你一件事:如果你用python編程,你一定聽過requests派诬,這兩個庫是同一個作者寫的簿晓。
一、快速使用
使用步驟:
1千埃、連接數(shù)據(jù)庫憔儿,返回 db 數(shù)據(jù)庫對象
2、db 對象執(zhí)行 sql 語句
# pip install records 安裝
import records
# 獲取數(shù)據(jù)庫
db = records.Database('mysql+pymysql://root:@localhost:3306/dev01_git')
# 查詢
rows = db.query('select * from lemon_user')
獲取數(shù)據(jù)庫的格式是標(biāo)準(zhǔn)的 URL 格式放可,如果使用的不是 mysql 數(shù)據(jù)庫谒臼,只需要換掉數(shù)據(jù)庫類型就可以了:
二、創(chuàng)建表
# 連接數(shù)據(jù)庫
db = records.Database('mysql+pymysql://root:@localhost:3306/dev01_git')
# 創(chuàng)建表
sql_create_table = """CREATE TABLE IF NOT EXISTS lemon_user (
name varchar(20),
age int
) DEFAULT CHARSET=utf8 ;"""
db.query(sql_create_table)
三耀里、插入單條數(shù)據(jù)
records 支持使用:variable
定義變量蜈缤,通過參數(shù)傳入完成動態(tài)傳值,在需要動態(tài)加載數(shù)據(jù)的時候非常有用:
user = {"name": "yuze5", "age": 20}
db.query('INSERT INTO lemon_user(name,age) values (:name, :age)', **user)
四冯挎、插入多條數(shù)據(jù)
sql 語句在執(zhí)行多條數(shù)據(jù)操作的時候非常不方便底哥,尤其是當(dāng)值還是變化的時候。 records 提供的 bulk_query 方法能快捷的插入和更新多條數(shù)據(jù):
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)
四房官、數(shù)據(jù)查詢
查詢到數(shù)據(jù)以后趾徽,可以通過 all() 方法獲取所有的記錄,支持 3 種類型翰守。默認(rèn)是自己封裝的 RecordCollection 對象孵奶,也可以通過 as_dict=True 參數(shù)轉(zhuǎn)成字典形式,可以通過 as_ordereddict=True 轉(zhuǎn)成排序字典形式
rows = db.query('SELECT * FROM lemon_user;')
# 得到所有數(shù)據(jù)
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())
五蜡峰、簡潔的數(shù)據(jù)庫事務(wù)支持
數(shù)據(jù)庫事務(wù)是經(jīng)常需要使用到的數(shù)據(jù)庫操作了袁,他通常是為了保持?jǐn)?shù)據(jù)原子性和一致性朗恳。比如一個轉(zhuǎn)賬的數(shù)據(jù)庫操作:1、從 yuze 賬號中讀取余額 载绿, 2粥诫、對 yuze 賬號余額減去轉(zhuǎn)賬 - 400 3、從 chaoge 賬號中把余額讀出來 4崭庸、對 chaoge 賬號做加法操作(+400)怀浆。我們必須保證這 4 步同時執(zhí)行成功,要么同時都不成功冀自。如果前 2 步已經(jīng)執(zhí)行成功,但是到第 3 步發(fā)生了錯誤導(dǎo)致后面都不能執(zhí)行秒啦,就會出現(xiàn)問題:yuze 的賬號被扣了錢熬粗,但是 chaoge 的賬號卻沒有加錢。通過數(shù)據(jù)庫事務(wù)就能避免這種情況余境。
with db.transaction() as tx:
user = {"name": "yuze9", "age": 20}
tx.query('INSERT INTO lemon_user(name,age) values (:name, :age)', **user)
# 下面是錯誤的 sql 語句驻呐,有錯誤,則上面的 sql 語句不會成功執(zhí)行芳来。
tx.query('sof')
六含末、導(dǎo)出Json
數(shù)據(jù)庫數(shù)據(jù)得到以后還需要進一步的操作,比如保存起來即舌。
rows = db.query('SELECT * FROM lemon_user;')
json_rows = rows.export('yaml')
print(json_rows)
七佣盒、數(shù)據(jù)導(dǎo)出Excel
rows = db.query('SELECT * FROM lemon_user;')
with open('users.xlsx', 'wb') as f:
f.write(rows.export('xlsx'))
導(dǎo)出的數(shù)據(jù)效果:
八、總結(jié)
records 支持多種不同的數(shù)據(jù)庫顽聂;records 的方法非常簡單和統(tǒng)一肥惭,不像 pymysql 還需要記住如游標(biāo)對象這樣的底層信息;自動實現(xiàn)上下文管理器紊搪,不需要關(guān)注鏈接狀態(tài)蜜葱;支持 :variable 方言,以安全的形式進行動態(tài)參數(shù)傳遞耀石,防止 sql 語句不規(guī)范導(dǎo)致的安全問題牵囤;支持?jǐn)?shù)據(jù)庫事務(wù),保持?jǐn)?shù)據(jù)的原子性和一致性滞伟;輕松導(dǎo)出為 json, yaml, xls, xlsx, pandas, html 等多種數(shù)據(jù)格式揭鳞。源碼非常簡單,你一定看得懂梆奈。
原文作者:檸檬班
鏈接:https://www.zhihu.com/question/24590883/answer/799802849