我遇到了一个问题,SQLAlchemy 在尝试确定两个表的主连接时抛出 NoForeignKeysError。奇怪的是,这个问题只发生在模型的第二次实例化上(即,如果我删除表并重新创建它们,它在我第一次运行脚本时有效,但在随后的时间里无效)。更奇怪的是,如果我inspect
用来查看子表的 ForeignKeys,我可以清楚地看到它们存在(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,错误仍然存在。