Peewee, 一個神奇的 Python 庫
Peewee 是一個簡單小巧的 ORM,它的概念簡潔明了,易于學習和使用。能夠與 SQLite、MySQL、MariaDB、PostgreSQL 等多種數據庫協同工作,擁有豐富的擴展功能。
1. 資料
- 官網: https://docs.peewee-orm.com/
- 源代碼:https://github.com/coleifer/peewee
2. 安裝
pip install Peewee
3. 特點
使用過Python的都知道,SQLAlchemy 幾乎已經是 Python 中的標準 ORM 框架了,功能強大,為什么還要使用Peewee呢?
Peewee 設計更為簡潔,其 API 簡單直觀,學習曲線平緩,新手能快速上手, 在一些簡單項目中,其輕量級的特點能使項目結構更清晰,開發效率更高。
核心特點如下:
- 輕量級:單文件實現,無復雜依賴
- 支持數據庫:多種數據庫支持
- 鏈式查詢:類似 Django ORM 的流暢 API
- 事務管理:簡單的事務和原子操作
- 擴展性:支持自定義字段、連接池、分片等
4. 快速上手
(1) 定義模型
通過定義類來創建模型,類的屬性對應數據庫表中的字段。
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 # 綁定數據庫
db.connect()
db.create_tables([User]) # 創建表
(2) 增刪改查(CURD)操作
# 創建數據
admin = User.create(name="Alice", age=30, is_admin=True)
user = User(name="Bob", age=25)
user.save()
# 查詢數據
admins = User.select().where(User.is_admin == True)
for u in admins:
print(u.name, u.age)
# 更新數據
User.update(age=31).where(User.name == "Alice").execute()
# 刪除數據
User.delete().where(User.name == "Bob").execute()
(3) 復雜查詢
支持鏈式查詢及聚合查詢
# 鏈式查詢
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)
輸出內容如下:
Bob 25
2 28.0
5. 高級功能
(1) 事務管理
with db.atomic(): # 原子事務
User.create(name="Charlie", age=40)
User.update(age=User.age + 1).execute()
(2) 關聯表
創建數據表post,關聯關系為has-many,一個用戶可以發布多個帖子。
class Post(Model):
user = ForeignKeyField(User, backref='posts')
content = TextField()
class Meta:
database = db # 綁定數據庫
# 查詢用戶的所有推文
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) # 存入數據庫時轉換
def python_value(self, db_str):
return uuid.UUID(db_str) # 從數據庫讀取時轉換
(4) 性能優化
N+1 查詢問題:使用 prefetch() 預加載關聯數據
users = User.select().prefetch(Tweet) # 一次加載所有關聯推文
批量插入:
with db.atomic():
User.insert_many([
{'name': 'Dave', 'age': 28},
{'name': 'Eve', 'age': 32}
]).execute()
6. 總結
Peewee 以簡潔的 API 設計著稱,代碼量通常比 SQLAlchemy 少 30%-50%,適合追求開發效率的場景:
- 適用場景:中小項目快速開發、原型設計、腳本數據處理
- 慎用場景:超大規模系統、需要復雜連接查詢、異步需求強烈