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
相关产品推荐
相关产品推荐

