on_delete='CASCADE' 好像没有效果

bzz*_*zzr 5 python peewee

User我在两个模型和之间有多对多关系,Role通过中间表实现,UserRoleThrough,它有两个ForeignKeyFields:一个引用User,另一个引用Role。据我从文档中了解到,ON DELETE功能是通过参数初始化来支持ForeignKeyFieldon_delete。尽管不太清楚on_delete可以采用什么值,但文档给出了一个示例,例如'CASCADE'。话虽这么说,on_delete='CASCADE'似乎没有效果,因为尝试从父表之一删除行会引发错误。

peewee.IntegrityError: FOREIGN KEY constraint failed
Run Code Online (Sandbox Code Playgroud)

使用数据库浏览器检查生成的架构表明外键未使用 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")
)
Run Code Online (Sandbox Code Playgroud)

那么我在这里做错了什么?我怎样去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()
Run Code Online (Sandbox Code Playgroud)

col*_*fer 4

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