SQLAlchemy未检测到_determine_joins上的ForeignKey,NoForeignKeysError

时间:2018-06-21 17:24:41

标签: python sqlalchemy

我遇到一个问题,当SQLAlchemy尝试确定两个表的主联接时,它将引发NoForeignKeysError。奇怪的是,此问题仅在模型的第二个实例化时发生(即,如果我删除表并重新创建它们,则该函数在我第一次运行脚本时有效,但在随后的时间中无效)。甚至更奇怪的是,如果我使用inspect来查看子表的ForeignKey,我可以清楚地看到它们的存在(psql,而且只要查看声明式库的元数据也可以确认这一点)。我的模型是由脚本生成的,所有其他具有相似或更复杂关系的表都可以按预期工作,但是只有这组特定的表才有此问题。

它引发的特定错误是:

  

sqlalchemy.exc.NoForeignKeysError:找不到'task_statuses'和'task_data'之间的任何外键关系。

  

sqlalchemy.exc.NoForeignKeysError:无法确定关系task_statuses.task_data上父/子表之间的连接条件-没有链接这些表的外键。确保引用列与ForeignKey或ForeignKeyConstraint关联,或指定“ primaryjoin”表达式。

代码段:

class TaskData(db_base):
    __tablename__ = 'task_data'
    __table_args__ = ({'extend_existing' : True})
    id = Column(Integer, primary_key=True)
    tags = relationship('TaskTags', backref='task_data', cascade='all, delete-orphan', passive_deletes=True)
    statuses = relationship('TaskStatuses', backref='task_data', cascade='all, delete-orphan', passive_deletes=True)

class TaskTags(db_base):
    __tablename__ = 'task_tags'
    __table_args__ = ({'extend_existing' : True})
    id = Column(Integer, primary_key=True)
    taskdata_id = Column(Integer, ForeignKey('task_data.id', ondelete='CASCADE'))

class TagStatuses(db_base):
    __tablename__ = 'task_statuses'
    __table_args__ = ({'extend_existing' : True})
    id = Column(Integer, primary_key=True)
    taskdata_id = Column(Integer, ForeignKey('task_data.id', ondelete='CASCADE'))

更新:

重新读取错误消息后,我意识到SQLAlchemy似乎认为task_statuses是父表,而实际上它是子表。那仍然没有任何解释,实际上更令人困惑,但可能值得注意。即使指定了primaryjoin,错误仍然存​​在。

1 个答案:

答案 0 :(得分:0)

问题最终归因于Graphene-SQLAlchemy

无论出于何种原因,在同一文件中定义SQLAlchemy模型和Graphene-SQLAlchemy等效项都会导致SQLAlchemy出现某些意外行为。

我通过将模型放在另一个文件中,然后在原始文件中生成所需的Graphene-SQLAlchemy对象,解决了该问题