SQLAlchemy 循环依赖 - 如何解决?

17 投票
1 回答
7838 浏览
提问于 2025-04-16 16:43

我有两个表,分别叫做 NewsFiles

# unrelated columns removed
class News(db.Model): 
    id = db.Column(db.Integer, primary_key=True)
    file_id_logo = db.Column(db.Integer, db.ForeignKey('files.id'))
    logo = db.relationship('File', lazy=False)

class File(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    news_id = db.Column(db.Integer, db.ForeignKey('news.id'))
    news = db.relationship('News', lazy=False, backref=db.backref('files'))

在我添加了 file_id_logo 这个外键之后,SQLalchemy 报了一个循环依赖的错误(CircularDependencyError)。我已经尝试过在 logo 关系中使用 post_update=True,但没有任何改变。

那该怎么解决这个问题呢?

以下情况可能会影响到这个问题(如果有关系的话):

  • 一个文件(File)要么没有新闻(News),要么只关联一条新闻。
  • 如果一个文件没有关联新闻,那么也没有新闻会把这个文件作为它的logo。
  • 一个新闻可以有多个文件,但这些文件中只能有一个是它的 logo
  • 所以如果一条新闻有一个 logo,那么被引用的文件也会把这条新闻作为它的 news

1 个回答

24

use_alter - 这个参数是传递给底层的外键约束,用来表示这个约束应该在创建表或删除表的操作之外进行生成或删除。想了解更多细节,可以查看那个类的构造函数。

https://docs.sqlalchemy.org/en/13/core/constraints.html#sqlalchemy.schema.ForeignKeyConstraint.params.use_alter

撰写回答