【超详细】Python ORM 入门指北 —— 用 Peewee 写增删改查
1 为什么选择 Peewee?
- 代码极简,上手只需 5 行
- 支持 SQLite / MySQL / PostgreSQL 一键切换
- 单文件 5 k 行源码,阅读无压力
- 与 Flask / FastAPI / Scrapy 都能愉快玩耍
2 环境 30 秒搭好
pip install peewee
3 建库 & 建表
from peewee import *
db = SqliteDatabase('demo.db')
class BaseModel(Model):
class Meta:
database = db
class User(BaseModel):
id = AutoField(primary_key=True)
name = CharField(max_length=20, null=False)
age = IntegerField(default=18)
email = CharField(unique=True)
db.connect()
db.create_tables([User])
4 增:Create
| 方式 | 特点 |
|---|
create() | 一行写完,自动保存 |
| 先 new 再 save | 方便中间处理逻辑 |
u1 = User.create(name='Alice', age=22, email='alice@example.com')
u2 = User(name='Bob', age=30, email='bob@example.com')
u2.save()
5 查:Retrieve
user = User.get_by_id(1)
alice = User.get(User.name == 'Alice')
adults = User.select().where(User.age >= 18)
top3 = User.select().order_by(User.age.desc()).limit(3)
gmail_users = User.select().where(User.email.endswith('@gmail.com'))
6 改:Update
| 场景 | 推荐写法 |
|---|
| 已拿到对象 | 修改字段 → save() |
| 批量更新 | update().execute() |
alice = User.get(User.name == 'Alice')
alice.age = 23
alice.save()
rows = User.update(age=19).where(User.age == 18).execute()
print(f"更新了 {rows} 行")
7 删:Delete
alice.delete_instance()
rows = User.delete().where(User.age < 18).execute()
print(f"删除了 {rows} 行")
8 事务 & 异常处理
from peewee import IntegrityError
try:
with db.atomic():
User.create(email='dup@example.com')
User.create(email='dup@example.com')
except IntegrityError as e:
print('捕获重复邮箱异常:', e)
9 完整代码一键跑
from db import User, db
def main():
db.connect()
db.create_tables([User])
User.create(name='Alice', age=22, email='alice@example.com')
User.create(name='Bob', age=30, email='bob@example.com')
for u in User.select():
print(u.id, u.name, u.age)
User.update(age=23).where(User.name == 'Alice').execute()
User.delete().where(User.name == 'Bob').execute()
if __name__ == '__main__':
main()
10 常见报错速查表
| 报错 | 原因 & 解决 |
|---|
UserDoesNotExist | get() 没查到记录,用 .get_or_none() 或 try/except |
IntegrityError | 唯一索引冲突,先查再插或捕获异常 |
OperationalError: no such table | 忘记 create_tables() |
11 彩蛋:用 ModelSelect 玩链式
query = (User
.select()
.where(User.age.between(20, 30))
.order_by(User.name)
.paginate(2, 10))
12 小结思维导图
Peewee CRUD
├── Create
│ ├── create()
│ └── save()
├── Retrieve
│ ├── get() / get_by_id()
│ ├── select() + where
│ └── order_by / limit / paginate
├── Update
│ ├── 改属性 + save()
│ └── update().execute()
└── Delete
├── delete_instance()
└── delete().execute()
如果本篇文章帮到了你,欢迎点赞 + 评论 + 收藏!
更多 Python 实战干货,关注作者不迷路~