You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Peewee中on_delete='CASCADE'失效问题咨询

Peewee ForeignKeyField on_delete='CASCADE' 失效问题解决

核心问题出在你使用了字符串 "CASCADE" 而不是Peewee内置的级联常量,同时旧表的外键约束没有更新也会导致功能失效,以下是具体解决方法:

1. 修正ForeignKeyField的on_delete参数

把模型中on_delete="CASCADE"替换为on_delete=peewee.CASCADE——Peewee的外键字段只识别预定义的常量值,不接受字符串字面量。修正后的完整代码:

import peewee

db = peewee.SqliteDatabase("base.db")

class BaseModel(peewee.Model):
    class Meta:
        database = db

class Grades(BaseModel):
    year = peewee.IntegerField()
    division = peewee.CharField(max_length=1)

class Student(BaseModel):
    dni = peewee.IntegerField()
    name = peewee.CharField(max_length=40)
    surname = peewee.CharField(max_length=40)
    gender = peewee.CharField(max_length=1)
    grade = peewee.ForeignKeyField(Grades, on_delete=peewee.CASCADE)

2. 更新数据库表结构

如果之前已经创建过表,旧表不会自动更新外键约束,需要根据环境选择操作:

  • 开发环境:直接删除原有的base.db文件,重新运行代码让Peewee生成带正确约束的新表
  • 生产环境:使用Peewee的迁移工具(比如peewee-migrate)编写迁移脚本,添加级联删除的外键约束

3. 验证级联删除效果

重建表后,用以下代码测试功能是否正常:

# 插入测试数据
with db.atomic():
    test_grade = Grades.create(year=2024, division='A')
    Student.create(dni=123456, name='Juan', surname='Perez', gender='M', grade=test_grade)

# 删除年级记录
test_grade.delete_instance()

# 检查对应学生是否被删除
assert Student.select().where(Student.dni == 123456).count() == 0

内容的提问来源于stack exchange,提问作者Maximo Arceci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:50:22