Python 輕量級ORM框架peewee

專欄作者:小小明
非常擅長解決各類復(fù)雜數(shù)據(jù)處理的邏輯,各類結(jié)構(gòu)化與非結(jié)構(gòu)化數(shù)據(jù)互轉(zhuǎn),字符串解析匹配等等。至今已經(jīng)幫助很多數(shù)據(jù)從業(yè)者解決工作中的實際問題,如果你在數(shù)據(jù)處理上遇到什么困難,歡迎評論區(qū)與我交流。
在前面的《改變python對象規(guī)則的黑魔法metaclass》一文中,我介紹了使用metaclass自己編寫ORM框架的思路。
當(dāng)然python庫中這類框架非常多,我們并沒有必要自己去實現(xiàn)。
ORM框架使用最廣泛的就是SQLAlchemy和Django自帶的ORM框架,但是SQLAlchemy的語法顯然相對Django的ORM框架麻煩一點。
而Django本身是一個web框架,比較重量級,僅僅為了使用Django的ORM框架的功能,而安裝Django有點導(dǎo)致系統(tǒng)臃腫。而peewee這個框架語法幾乎與Django的ORM框架一致,而又非常輕量。

它的安裝非常簡單:
pip?install?peewee
如果你在使用mysql數(shù)據(jù)庫的過程中報出如下錯誤:
peewee.ImproperlyConfigured:?MySQL?driver?not?installed!
則需要安裝一個mysql的驅(qū)動:
pip?install?pymysql
peewee的whl包是880kB,pymysql的whl包是51KB,非常輕量級。
peewee的官方文檔地址:http://docs.peewee-orm.com/en/latest/index.html
下面測試一下各項功能:
from?peewee?import?*
db?=?MySQLDatabase('test',?host="localhost",?user='root',?passwd='123456',?port=3306)
#?定義Person
class?Person(Model):
????name?=?CharField()
????birthday?=?DateField()
????is_relative?=?BooleanField()
????class?Meta:
????????database?=?db
????????
def?test_create():
????Person.create_table()
????#?創(chuàng)建多張表也可以這樣
????#?database.create_tables([Person])
def?test_insert():
????#?添加一條數(shù)據(jù)
????p?=?Person(name='小華',?birthday=date(1996,?12,?20),?is_relative=True)
????p.save()
def?test_delete():
????#?刪除姓名為perter的數(shù)據(jù)
????Person.delete().where(Person.name?==?'perter').execute()
????#?已經(jīng)實例化的數(shù)據(jù),?使用delete_instance
????p?=?Person(name='小華',?birthday=date(1996,?12,?20),?is_relative=False)
????p.id?=?1
????p.save()
????p.delete_instance()
def?test_update():
????#?已經(jīng)實例化的數(shù)據(jù),指定了id這個primary?key,則此時保存就是更新數(shù)據(jù)
????p?=?Person(name='小華',?birthday=date(1996,?12,?20),?is_relative=False)
????p.id?=?1
????p.save()
????#?更新birthday數(shù)據(jù)
????q?=?Person.update({Person.birthday:?date(1983,?12,?21)}).where(Person.name?==?'小華')
????q.execute()
def?test_query():
????#?查詢單條數(shù)據(jù)
????p?=?Person.get(Person.name?==?'小華')
????print(p.name,?p.birthday,?p.is_relative)
????#?使用where().get()查詢
????p?=?Person.select().where(Person.name?==?'小華').get()
????print(p.name,?p.birthday,?p.is_relative)
????#?查詢多條數(shù)據(jù)
????persons?=?Person.select().where(Person.is_relative?==?True)
????for?p?in?persons:
????????print(p.name,?p.birthday,?p.is_relative)
下面測試一個各個方法。
測試創(chuàng)建表:
if?__name__=="__main__":
????Person.create_table()
執(zhí)行完畢,檢查數(shù)據(jù)庫成功創(chuàng)建下面這張表:

測試插入數(shù)據(jù):
if?__name__=="__main__":
????p?=?Person(name='小華',?birthday=date(1996,?12,?20),?is_relative=True)
????p.save()
執(zhí)行完畢后,表數(shù)據(jù)多了一行:

測試查詢數(shù)據(jù):
if?__name__=="__main__":
?p?=?Person.get(Person.name?==?'小華')
????print(p.name,?p.birthday,?p.is_relative)
結(jié)果:
小華?1996-12-20?True
測試刪除數(shù)據(jù):
if?__name__=="__main__":
????Person.delete().where(Person.name?==?'小華').execute()
執(zhí)行后,數(shù)據(jù)庫對應(yīng)的記錄被刪除:

測試修改數(shù)據(jù):
if?__name__?==?"__main__":
????p?=?Person(name='小新',?birthday=date(1995,?6,?20),?is_relative=False)
????p.save()
????#?更新birthday數(shù)據(jù)
????q?=?Person.update({Person.birthday:?date(1983,?5,?21)}).where(Person.name?==?'小新')
????q.execute()
執(zhí)行后:

測試批量查詢:
if?__name__?==?"__main__":
????for?i?in?range(1,?5):
????????p?=?Person(name=f'小張{i}',?birthday=date(1995,?6,?20),?is_relative=False)
????????p.save()
????#?查詢多條數(shù)據(jù)
????persons?=?Person.select().where(Person.is_relative?==?False)
????for?p?in?persons:
????????print(p.name,?p.birthday,?p.is_relative)
執(zhí)行后:

結(jié)果:
小新?1983-05-21?False
小張1?1995-06-20?False
小張2?1995-06-20?False
小張3?1995-06-20?False
小張4?1995-06-20?False
更多用法可參考官方文檔。
我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實戰(zhàn)教程,請持續(xù)關(guān)注Python實用寶典。
有任何問題,可以在公眾號后臺回復(fù):加群,回答相應(yīng)紅字驗證信息,進入互助群詢問。
原創(chuàng)不易,希望你能在下面點個贊和在看支持我繼續(xù)創(chuàng)作,謝謝!
點擊下方閱讀原文可獲得更好的閱讀體驗
Python實用寶典?(pythondict.com)
不只是一個寶典
歡迎關(guān)注公眾號:Python實用寶典
