我遇到一个问题,当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,错误仍然存在。
答案 0 :(得分:0)
问题最终归因于Graphene-SQLAlchemy
无论出于何种原因,在同一文件中定义SQLAlchemy模型和Graphene-SQLAlchemy等效项都会导致SQLAlchemy出现某些意外行为。
我通过将模型放在另一个文件中,然后在原始文件中生成所需的Graphene-SQLAlchemy对象,解决了该问题