ON_DELETE="CASCADE" 不适用于 flask-sqlalchemy

Posted

技术标签:

【中文标题】ON_DELETE="CASCADE" 不适用于 flask-sqlalchemy【英文标题】:ON_DELETE="CASCADE" does not work with flask-sqlalchemy 【发布时间】:2021-10-03 01:56:25 【问题描述】:

我正在烧瓶中开发一个 WebApp,并使用 flask-sqlalchemy 定义我的模型并将它们存储在 SQLite 数据库中。总之,我有以下3个模型(一个Porject可以有多个文件,每个文件可以有多个结果):

class Project(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)

    files = db.relationship("File", backref="project", passive_deletes=True)

class File(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    path = db.Column(db.String, nullable=False)

    project_id = db.Column(
        db.Integer,
        db.ForeignKey("project.id", ondelete="CASCADE"),
        nullable=False)

    results = db.relationship("Result", backref="file", passive_deletes=True)

class Result(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String, nullable=False)

    file_id = db.Column(
        db.Integer,
        db.ForeignKey("file.id", ondelete="CASCADE"),
        nullable=False)

现在的问题是,当我创建项目时,创建并分配一些文件给项目,创建一些结果并将它们分配给一些文件,最后删除项目,级联删除的文件和结果不起作用。我找到了以下post 并按照那里的建议实现了db.relationship 属性,但问题仍然存在。

P.S.:这是一个minimal working example,它显示了问题。

P.P.S.:有人可以确认,该问题是可重现的。并不是说它只发生在我的电脑/我的环境中。

【问题讨论】:

docs.sqlalchemy.org/en/14/dialects/… ohhh...我明白了...我必须注册此侦听器,以便为每个连接执行此 pragma >. 【参考方案1】:

嗯,这个答案属于RTFM 类别。正如 Gord Thompson 通过 sqlalchemy 纪录片的链接“提到”的那样,需要在烧瓶应用程序启动时添加以下行:

from sqlalchemy.engine import Engine
from sqlalchemy import event

db = SQLAlchemy(app)

@event.listens_for(Engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
    cursor = dbapi_connection.cursor()
    cursor.execute("PRAGMA foreign_keys=ON")
    cursor.close()

(现在我问自己,为什么在flask-sqlalchemy 文档中没有写一个字:-/)

【讨论】:

以上是关于ON_DELETE="CASCADE" 不适用于 flask-sqlalchemy的主要内容,如果未能解决你的问题,请参考以下文章

on_delete=models.CASCADE级联删除

on_delete=models.CASCADE级联删除

TypeError: __init__() missing 1 required positional argument: 'on_delete'

on_delete的相关使用说明

django 在这种情况下如何使用Q和过滤related_name?

Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'