我有两个模型:用户和组。
用户可以在一个组中,所以:
class User(db.Model):
# other fields
group_id = db.Column(db.Integer(), db.ForeignKey('group.id'))
但另一方面,我还将获得有关创建该特定组的用户的一些信息:
class Group(db.Model):
# other fields
users = db.relationship("User", backref='group')
created_by = db.Column(db.Integer(), db.ForeignKey('user.id'))
结果是:
sqlalchemy.exc.CircularDependencyError: Can't sort tables for DROP; an unresolvable foreign key dependency exists between tables: group, user. Please ensure that the ForeignKey and ForeignKeyConstraint objects involved in the cycle have names so that they can be dropped using DROP CONSTRAINT.
我尝试了use_alter=True
,但是它给了我
sqlalchemy.exc.CompileError: Can't emit DROP CONSTRAINT for constraint ForeignKeyConstraint(
答案 0 :(得分:0)
有趣的是,我希望您得到AmbiguousForeignKeyError
,但您似乎却得到CircularDependencyError
?根据{{3}},这是由两种情况引起的:
- 在会话刷新操作中,如果两个对象相互依赖,则无法通过INSERT或 仅删除语句;需要进行UPDATE后关联或 预取消关联外键约束值之一。的 指向自己的行/相互描述的post_update标志 相关行可以解决此循环。
- 在MetaData.sorted_tables中 操作中,两个ForeignKey或ForeignKeyConstraint对象相互对应 互相参考。将use_alter = True标志应用于一个或两个,请参见 通过ALTER创建/删除外键约束。
我不确定您正在执行的操作会导致此特定错误,但很可能您可以通过解决含糊不清的引用来解决它。
含糊不清的引用是由于当多个引用(在这种情况下为用户和created_by)存在时,SQLAlchemy无法弄清楚如何执行联接。可以通过指定关系应该如何连接来解决此问题,可以通过给出应该使用的特定外键或明确确定连接条件来完成。
您可以在此处看到将其应用于您的示例:
class User(Base):
# Other setup / fields
group_id = Column(Integer, ForeignKey('group.id'))
class Group(Base):
# Other setup / fields
created_by_id = Column(Integer, ForeignKey('user.id'), nullable=False)
created_by = relationship("User", foreign_keys=[created_by_id])
users = relationship("User", backref="group", primaryjoin=id==User.group_id)
有关关系联接的文档:the docs