on_delete='CASCADE'好像没有效果
on_delete='CASCADE' seems to have no effect
我有两个模型 User
和 Role
之间的多对多关系,通过中介 table、UserRoleThrough
实现,它有两个 ForeignKeyField
s:一个引用 User
,另一个引用 Role
。据我从文档中了解到,ON DELETE functionality is supported by initializing ForeignKeyField
with an on_delete
argument. Though it's not very clear what values on_delete
can take, the documentation 给出了一个示例,例如'CASCADE'
。话虽这么说,on_delete='CASCADE'
似乎没有效果,因为尝试从父 table 之一删除一行会引发错误。
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
我有两个模型 User
和 Role
之间的多对多关系,通过中介 table、UserRoleThrough
实现,它有两个 ForeignKeyField
s:一个引用 User
,另一个引用 Role
。据我从文档中了解到,ON DELETE functionality is supported by initializing ForeignKeyField
with an on_delete
argument. Though it's not very clear what values on_delete
can take, the documentation 给出了一个示例,例如'CASCADE'
。话虽这么说,on_delete='CASCADE'
似乎没有效果,因为尝试从父 table 之一删除一行会引发错误。
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