Peewee ORM 入门指南(Python)
Peewee 是极简而强大的 Python ORM:模型定义、增删改查、查询表达式一应俱全,适合小型应用与脚本。本文以图书管理应用为例完整上手。
直接回答:Peewee 是一个极简主义的 Python ORM:语法直白、体积小巧,小型应用、脚本和不想引入重型框架的项目,用它获得数据库能力;ORM 本身仍有对象构造和查询开销。
Peewee 的甜区
SQLAlchemy 功能全但学习曲线陡;Django ORM 绑定框架。Peewee 的定位是:一个文件就能跑起来的小项目,也要体面的 ORM——模型、迁移辅助、查询表达式都有,提供较紧凑的 API。
安装与模型
pip install peewee
from peewee import *
db = SqliteDatabase("library.db")
class Base(Model):
class Meta:
database = db
class Book(Base):
title = CharField()
author = CharField()
year = IntegerField()
available = BooleanField(default=True)
db.connect()
db.create_tables([Book])
模型类即表定义,字段类型一目了然——这就是 Peewee 的全部仪式感。
新增数据
Book.create(title="活着", author="余华", year=1993)
book = Book(title="百年孤独", author="马尔克斯", year=1967)
book.save()
# 批量
Book.insert_many([
{"title": "围城", "author": "钱钟书", "year": 1947},
{"title": "边城", "author": "沈从文", "year": 1934},
]).execute()
查询
# 条件查询:Python 运算符即 SQL
old_books = Book.select().where(Book.year < 1950)
# 复合条件
q = Book.select().where((Book.author == "余华") & (Book.available == True))
# 排序、分页、单条
Book.select().order_by(Book.year.desc()).limit(10)
Book.get(Book.title == "围城") # 无结果抛异常
Book.get_or_none(Book.title == "不存在") # 温和版
# 聚合
from peewee import fn
Book.select(fn.COUNT(Book.id).alias("cnt")).scalar()
运算符重载是 Peewee 的招牌:==、<、&、| 直接拼出 WHERE 条件,可读性极佳。
更新与删除
# 单条
book = Book.get(Book.title == "围城")
book.available = False
book.save()
# 批量更新(原子操作,推荐)
Book.update(available=True).where(Book.author == "余华").execute()
# 删除
Book.delete().where(Book.year < 1900).execute()
进阶速览
- 多数据库:SQLite、PostgreSQL、MySQL 都支持,需核对类型、SQL 方言、迁移和事务差异,不能只换驱动;
- 关系:ForeignKeyField 建立关联,
backref反查; - 迁移:配
playhouse.migrate做字段级变更; - 连接池:
PooledMySQLDatabase等池化连接应对并发。
常见问题(FAQ)
Q:Peewee 和 SQLAlchemy 怎么选?
A:小项目、脚本、嵌入式工具选 Peewee;中大型应用、复杂查询、需要 Alembic 迁移体系选 SQLAlchemy。应按复杂查询、迁移及团队熟悉度评估。
Q:支持异步吗?
A:当前 Peewee 4.x 官方提供 playhouse.pwasyncio 扩展,需 greenlet 及对应异步驱动;本文 CRUD 仍是同步写法。旧版项目应先核对版本,不能把同步调用直接放进事件循环。
Q:生产可用吗?
A:可用且有不少存量案例,但并发写入场景(Web 服务)建议池化连接 + WAL 模式(SQLite)或直接 PostgreSQL。
官方参考
本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。