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。

官方参考

本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台