Sqlalchemy一-多和一对一表

时间:2018-08-28 12:05:18

标签: python sqlalchemy

我有两个模型:用户和组。

用户可以在一个组中,所以:

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(

1 个答案:

答案 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