【AI总结】Python ORM 入门指北 —— 用 Peewee 写增删改查

【超详细】Python ORM 入门指北 —— 用 Peewee 写增删改查


1 为什么选择 Peewee?

  • 代码极简,上手只需 5 行
  • 支持 SQLite / MySQL / PostgreSQL 一键切换
  • 单文件 5 k 行源码,阅读无压力
  • 与 Flask / FastAPI / Scrapy 都能愉快玩耍

2 环境 30 秒搭好

pip install peewee
# 可选:MySQL / PostgreSQL 驱动
# pip install pymysql psycopg2-binary

3 建库 & 建表

# db.py
from peewee import *

# 使用 SQLite 文件,生产可换成 MySQLDatabase
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方便中间处理逻辑
# 方式 A:一步到位
u1 = User.create(name='Alice', age=22, email='alice@example.com')

# 方式 B:先实例化再 save
u2 = User(name='Bob', age=30, email='bob@example.com')
u2.save()          # 手动落库

5 查:Retrieve

# 5.1 主键查询
user = User.get_by_id(1)

# 5.2 条件查询:单个
alice = User.get(User.name == 'Alice')

# 5.3 条件查询:多个
adults = User.select().where(User.age >= 18)

# 5.4 排序 + 切片
top3 = User.select().order_by(User.age.desc()).limit(3)

# 5.5 模糊搜索
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()

# 批量更新:把所有 18 岁用户改成 19
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 完整代码一键跑

# run.py
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 常见报错速查表

报错原因 & 解决
UserDoesNotExistget() 没查到记录,用 .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))  # 第 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 实战干货,关注作者不迷路~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝吻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值