2011-04-30 168 views
17

我有两个表,NewsFilesSQLAlchemy循环依赖 - 如何解决它?

# 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

回答

22

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

http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html?highlight=use_alter#foreign-key-api-constructs

+0

工作很好,摆脱了错误,但它打破了一些其他关系。所以我决定简单地摆脱ForeignKey。无论如何都接受它,因为答案本身是正确的。 – ThiefMaster 2011-04-30 19:32:00

+2

@ThiefMaster您可能只需要在关系上设置primaryjoin - 当两个表之间存在多个关系/回退时,它们无法确定连接方向。 – letitbee 2011-05-07 09:37:06

+0

我在这里找到了信息:http://docs.sqlalchemy.org/en/rel_0_8/core/constraints.html – 2015-10-10 20:07:22