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的主要内容,如果未能解决你的问题,请参考以下文章
TypeError: __init__() missing 1 required positional argument: 'on_delete'
django 在这种情况下如何使用Q和过滤related_name?
Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'