SqlAlchemy在不使用字符串的情况下避免ORM中的循环依赖

时间:2018-12-18 22:35:17

标签: python sqlalchemy flask-sqlalchemy

是否有一种方法可以通过使用类/成员引用而不是字符串常量来在SqlAlchemy ORM定义中更明确地显示,而不会遇到循环依赖项? ORM的主要好处之一是,与在各处复制字符串常量相比,它使文件“更干净”且更易于维护。这完全破坏了这种好处。

SqlAlchemy文档中的一个简单示例,显示了使用字符串常量。

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship("Child")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))

我想这样做:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship(Child)

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey(Parent.id))

这通常是合法的,但是问题是我遇到了循环依赖关系,需要从Child导入Parent和从Parent导入Child(假设它们在单独的文件中)。我能做的最好的就是消除差异-并在一端使用字符串,在另一端使用带有import的显式类。只是觉得恶心。

只是想知道我是否缺少某些东西,或者有人可以通过某种方式完成此任务。

1 个答案:

答案 0 :(得分:1)

作为基于字符串的属性的替代方法,还可以在创建所有类之后定义属性。只需在事实之后将它们添加到目标类中即可:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey(Parent.id))

Parent.childen = relationship(Child)