Peewee, 一個(gè)神奇的 Python 庫(kù)
Peewee 是一個(gè)簡(jiǎn)單小巧的 ORM,它的概念簡(jiǎn)潔明了,易于學(xué)習(xí)和使用。能夠與 SQLite、MySQL、MariaDB、PostgreSQL 等多種數(shù)據(jù)庫(kù)協(xié)同工作,擁有豐富的擴(kuò)展功能。
1. 資料
- 官網(wǎng): https://docs.peewee-orm.com/
- 源代碼:https://github.com/coleifer/peewee
2. 安裝
pip install Peewee
3. 特點(diǎn)
使用過Python的都知道,SQLAlchemy 幾乎已經(jīng)是 Python 中的標(biāo)準(zhǔn) ORM 框架了,功能強(qiáng)大,為什么還要使用Peewee呢?
Peewee 設(shè)計(jì)更為簡(jiǎn)潔,其 API 簡(jiǎn)單直觀,學(xué)習(xí)曲線平緩,新手能快速上手, 在一些簡(jiǎn)單項(xiàng)目中,其輕量級(jí)的特點(diǎn)能使項(xiàng)目結(jié)構(gòu)更清晰,開發(fā)效率更高。
核心特點(diǎn)如下:
- 輕量級(jí):?jiǎn)挝募?shí)現(xiàn),無復(fù)雜依賴
- 支持?jǐn)?shù)據(jù)庫(kù):多種數(shù)據(jù)庫(kù)支持
- 鏈?zhǔn)讲樵儯侯愃?Django ORM 的流暢 API
- 事務(wù)管理:簡(jiǎn)單的事務(wù)和原子操作
- 擴(kuò)展性:支持自定義字段、連接池、分片等
4. 快速上手
(1) 定義模型
通過定義類來創(chuàng)建模型,類的屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的字段。
from peewee import *
db = SqliteDatabase('my_app.db') # 使用 SQLite
class User(Model):
name = CharField()
age = IntegerField()
is_admin = BooleanField(default=False)
class Meta:
database = db # 綁定數(shù)據(jù)庫(kù)
db.connect()
db.create_tables([User]) # 創(chuàng)建表
(2) 增刪改查(CURD)操作
# 創(chuàng)建數(shù)據(jù)
admin = User.create(name="Alice", age=30, is_admin=True)
user = User(name="Bob", age=25)
user.save()
# 查詢數(shù)據(jù)
admins = User.select().where(User.is_admin == True)
for u in admins:
print(u.name, u.age)
# 更新數(shù)據(jù)
User.update(age=31).where(User.name == "Alice").execute()
# 刪除數(shù)據(jù)
User.delete().where(User.name == "Bob").execute()
(3) 復(fù)雜查詢
支持鏈?zhǔn)讲樵兗熬酆喜樵?/p>
# 鏈?zhǔn)讲樵?users = (User
.select()
.where((User.age > 20) & (User.is_admin == False))
.order_by(User.age.desc())
.limit(5))
for user in users:
print(user.name, user.age)
# 聚合查詢
count = User.select(fn.COUNT(User.id)).scalar()
avg_age = User.select(fn.AVG(User.age)).scalar()
print(count, avg_age)
輸出內(nèi)容如下:
Bob 25
2 28.0
5. 高級(jí)功能
(1) 事務(wù)管理
with db.atomic(): # 原子事務(wù)
User.create(name="Charlie", age=40)
User.update(age=User.age + 1).execute()
(2) 關(guān)聯(lián)表
創(chuàng)建數(shù)據(jù)表post,關(guān)聯(lián)關(guān)系為has-many,一個(gè)用戶可以發(fā)布多個(gè)帖子。
class Post(Model):
user = ForeignKeyField(User, backref='posts')
content = TextField()
class Meta:
database = db # 綁定數(shù)據(jù)庫(kù)
# 查詢用戶的所有推文
alice_posts = User.get(name="Alice").posts
for post in alice_posts:
print(post.content)
(3) 自定義字段
class UUIDField(CharField):
def db_value(self, uuid_obj):
return str(uuid_obj) # 存入數(shù)據(jù)庫(kù)時(shí)轉(zhuǎn)換
def python_value(self, db_str):
return uuid.UUID(db_str) # 從數(shù)據(jù)庫(kù)讀取時(shí)轉(zhuǎn)換
(4) 性能優(yōu)化
N+1 查詢問題:使用 prefetch() 預(yù)加載關(guān)聯(lián)數(shù)據(jù)
users = User.select().prefetch(Tweet) # 一次加載所有關(guān)聯(lián)推文
批量插入:
with db.atomic():
User.insert_many([
{'name': 'Dave', 'age': 28},
{'name': 'Eve', 'age': 32}
]).execute()
6. 總結(jié)
Peewee 以簡(jiǎn)潔的 API 設(shè)計(jì)著稱,代碼量通常比 SQLAlchemy 少 30%-50%,適合追求開發(fā)效率的場(chǎng)景:
- 適用場(chǎng)景:中小項(xiàng)目快速開發(fā)、原型設(shè)計(jì)、腳本數(shù)據(jù)處理
- 慎用場(chǎng)景:超大規(guī)模系統(tǒng)、需要復(fù)雜連接查詢、異步需求強(qiáng)烈