SQLAlchemy 未检测 _determine_joins 上的 ForeignKeys,NoForeignKeysError

SQLAlchemy not detecting ForeignKeys on _determine_joins, NoForeignKeysError

我遇到一个问题,SQLAlchemy 在尝试确定两个 table 的主连接时抛出 NoForeignKeysError。奇怪的是,这个问题只发生在模型的第二次实例化上(即,如果我删除 tables 并重新创建它们,它在我第一次 运行 脚本时起作用,但在随后的时间里不起作用)。更奇怪的是,如果我使用 inspect 查看子 table 的外键,我可以清楚地看到它们存在(psql 并且仅查看声明性基础的元数据也证实了这一点) .我的模型是由脚本生成的,所有其他具有类似或更复杂关系的 table 都按预期工作,但是只有这组特定的 table 存在此问题。

它抛出的具体错误是:

sqlalchemy.exc.NoForeignKeysError: Can't find any foreign key relationships between 'task_statuses' and 'task_data'.

sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship task_statuses.task_data - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.

代码片段:

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 是父 table,而实际上它是子。这仍然没有解释任何内容,实际上更令人困惑,但可能值得注意。即使指定了 primaryjoin,错误仍然存​​在。

问题最终出现在 Graphene-SQLAlchemy 上

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

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