0

我遇到了一个问题,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,错误仍然存​​在。

4

1 回答 1

0

问题最终出在 Graphene-SQLAlchemy

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

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

于 2018-06-25T19:21:03.533 回答