gpt4 book ai didi

python - on_delete ='CASCADE' 好像没有效果

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:03 25 4
gpt4 key购买 nike

我在两个模型之间建立了多对多关系,UserRole,通过中间表 UserRoleThrough 实现,它有两个 ForeignKeyField:一个引用 User,另一个引用 Role。据我从文档中了解到,ON DELETE通过使用 on_delete 参数初始化 ForeignKeyField 来支持功能。虽然不是很清楚 on_delete 可以取什么值,documentation举个例子,例如“级联”。这就是说,on_delete='CASCADE' 似乎没有效果,因为尝试从其中一个父表中删除一行会引发错误。

peewee.IntegrityError: FOREIGN KEY constraint failed

使用数据库浏览器检查生成的模式显示外键未使用 ON DELETE 声明。

CREATE TABLE "userrolethrough" (
"id" INTEGER NOT NULL PRIMARY KEY,
"user_id" INTEGER NOT NULL,
"role_id" INTEGER NOT NULL,
FOREIGN KEY ("user_id") REFERENCES "user" ("id"),
FOREIGN KEY ("role_id") REFERENCES "role" ("id")
)

那么我这里做错了什么?如何让 on_delete 工作?这是使用 Python 3.6 和 Peewee 3.0.2 的最小可重现示例。

import peewee

db_proxy = peewee.Proxy()

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

class User(BaseModel):
name = peewee.CharField()

class Role(BaseModel):
name = peewee.CharField()

class UserRoleThrough(BaseModel):
user = peewee.ForeignKeyField(User, on_delete='CASCADE')
role = peewee.ForeignKeyField(Role, on_delete='CASCADE')


if __name__ == '__main__':
db = peewee.SqliteDatabase('test.db')
db.pragma('foreign_keys', 1, permanent=True)
db_proxy.initialize(db)

tables = [
User,
Role,
UserRoleThrough
]
db.create_tables(tables)

isaac = User.create(name='Isaac')
admin = Role.create(name='Admin')
UserRoleThrough.create(user=isaac, role=admin)
User.delete().execute()

最佳答案

这在 3.0.6 中已修复:github.com/coleifer/peewee/blob/master/CHANGELOG.md#306

关于python - on_delete ='CASCADE' 好像没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48776346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com