SQLalchemy:无法确定关系上的父/子表之间的连接条件

Posted

技术标签:

【中文标题】SQLalchemy:无法确定关系上的父/子表之间的连接条件【英文标题】:SQLalchemy: Could not determine join condition between parent/child tables on relationship 【发布时间】:2022-01-11 08:04:25 【问题描述】:

所以我在尝试使用 SQLAlchemy 映射的同一个 python 文件中有这两个简单的类,其中用户列“password_id”也是表密码“password_id”列的外键

from sqlalchemy.orm import relationship, declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.sql.schema import ForeignKey

Base = declarative_base()
class User(Base):
    
    __tablename__ = 'users'

    user_id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)
    password_id = Column(Integer, ForeignKey('password.password_id'))

    parent = relationship("Password", back_populates="users")

class Password(Base):
    
    __tablename__ = 'passwords'

    password_id = Column(Integer, primary_key=True)
    password = Column(String)
    last_change_date = Column(DateTime)
    valid_until = Column(DateTime)
    
    child = relationship("User", back_populates="passwords", uselist=False)

这是上下文的数据库架构:

我正在关注来自 sql alchemy 的this guide,但由于某种原因,我不断收到标题中的错误“确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或者指定一个‘primaryjoin’表达式。” ,这很奇怪,因为根据我在指南中看到的内容,我的类已正确映射,因此我无法理解为什么会发生此错误。

提前谢谢你

【问题讨论】:

不要在两个类中添加关系。仅在 Password 类中添加关系,并将其从 User 类中删除 @HashirIrfan 为什么会这样?密码和用户不应该是一对一的关系吗?我在帖子中引用的指南表明父母和孩子都应该有关系 您使用了反向引用,因此您可以通过用户名和密码访问它。所以你只需要定义一次关系 【参考方案1】:

我认为问题出在以下行(ForeignKey 中的表名)...

password_id = Column(Integer, ForeignKey('password.password_id'))

应该是密码而不是密码。

【讨论】:

就是这样!复杂的语法...谢谢!

以上是关于SQLalchemy:无法确定关系上的父/子表之间的连接条件的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy ORM 一对多关系未从数据库加载所有记录

按主键排序 sqlalchemy 关系

SQLAlchemy学习-4.一对一关系

SQLAlchemy学习-4.一对一关系

识别和非识别关系之间有什么区别?

SQLAlchemy 一对多关系澄清