SQLAlchemy 循环依赖 - 如何解决?

Posted

技术标签:

【中文标题】SQLAlchemy 循环依赖 - 如何解决?【英文标题】:SQLAlchemy circular dependency - how to solve it? 【发布时间】:2011-08-16 04:01:38 【问题描述】:

我有两张桌子,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 fkey 后,SQLalchemy 引发了 CircularDependencyError。 我已经在logo 关系中尝试过post_update=True,但它并没有改变任何东西。

解决这个问题的正确方法是什么?

以下情况是可能的(以防万一):

一个文件没有或只分配了一个新闻。 如果文件没有新闻,则也没有以该文件为标志的新闻。 一个新闻可以有多个文件,但这些文件中只有一个可以是它的logo。 因此,如果新闻具有logo,则引用的文件也具有此新闻作为其news

【问题讨论】:

【参考方案1】:

use_alter – 传递给底层的 ForeignKeyConstraint 以指示约束应该从 CREATE TABLE/DROP TABLE 语句外部生成/删除。有关详细信息,请参阅该类的构造函数。

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

【讨论】:

工作正常以消除错误,但它破坏了其他一些关系。所以我决定简单地摆脱 ForeignKey。无论如何都接受它,因为答案本身是正确的。 @ThiefMaster 您可能只需要在您的关系上设置 primaryjoin - 当两个表之间存在多个关系/反向引用时,它们无法确定连接方向。 我在这里找到了信息:docs.sqlalchemy.org/en/rel_0_8/core/constraints.html

以上是关于SQLAlchemy 循环依赖 - 如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

面试题:如何解决Spring 的循环依赖问题

Spring是如何解决循环依赖的?

彻底理解Spring如何解决循环依赖

Spring 循环引用AbstractFactoryBean 如何解决循环依赖

Spring到底是如何解决循环依赖的?

spring如何解决循环依赖