【问题标题】:SQLAlchemy Many to Many relationship parameterSQLAlchemy 多对多关系参数
【发布时间】:2016-08-06 06:50:08
【问题描述】:

我正在使用 SQLAlchemy ORM 来获取属于某个用户的角色,但出现以下错误

无法确定父/子表之间的连接条件 关系 AppRole.users - 有多个外键路径 通过辅助表“app_user_role”链接表。指定 'foreign_keys' 参数,提供那些列的列表 应计为包含来自 每个父表和子表的辅助表。

表格定义为:

class AppUserRole(Base_Write):
    __tablename__ = 'app_user_role'
    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime, server_default=text('NOW()'), nullable=False)
    created_by = Column(Integer, ForeignKey('app_user.id'), nullable=False)
    is_deleted = Column(Boolean, server_default='0', nullable=False)
    date_deleted = Column(DateTime)
    deleted_by = Column(Integer, ForeignKey('app_user.id'))
    user_id = Column(Integer, ForeignKey('app_user.id'), nullable=False)
    role_id = Column(Integer, ForeignKey('app_role.id'), nullable=False)
    date_assigned = Column(DateTime, nullable=False)


class AppRole(Base_Write):
    __tablename__ = 'app_role'
    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime, server_default=text('NOW()'), nullable=False)
    created_by = Column(Integer)
    is_deleted = Column(Boolean, server_default='0', nullable=False)
    date_deleted = Column(DateTime)
    deleted_by = Column(Integer, ForeignKey('app_user.id'))
    role_classification_id = Column(Integer, ForeignKey('app_role_classification.id'), nullable=False)
    role_code = Column(String(10), nullable=False, unique=True)
    role_name = Column(String(30), nullable=False)

    users = relationship("AppUser", secondary="app_user_role", back_populates="app_role")


class AppUser(Base_Write):
    __tablename__ = 'app_user'
    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime, server_default=text('NOW()'), nullable=False)
    created_by = Column(Integer, ForeignKey('app_user.id'), nullable=False)
    is_deleted = Column(Boolean, server_default='0', nullable=False)
    date_deleted = Column(DateTime)
    deleted_by = Column(Integer, ForeignKey('app_user.id'))
    username = Column(String(50), nullable=False, unique=True)

    roles = relationship("AppRole", secondary="app_user_role", back_populates="app_user")

正在运行的查询是:

for app_user in session.query(AppUser).\
filter(AppUser.is_deleted == False).filter(AppUser.id == user_id):
    #print the names of the roles assigned
    print(app_user.roles.role_name)

问题是,我在其他表中定义了其他多对多关系参数并且一切正常。在这里,尽管我不断收到该错误。 SO上有其他类似的问题,但尝试了不同的建议,但没有运气。我已经尝试按照建议的错误进行操作,并使用了我以前的问题here on SO,但即使放置 foreign_keys 选项似乎也不起作用,尽管我必须承认我真的在猜测放置它的位置。

SQLAlchemy 版本 ==1.0.12,Postgresql 9.5

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    正如错误消息所说,您有多个外键将AppRole 链接到AppUser,即AppUserRole.user_idAppUserRole.deleted_byAppUserRole.created_by,因此您需要指定foreign_keys 参数:

    class AppRole(Base):
        ...
        users = relationship("AppUser", secondary="app_user_role", 
                             foreign_keys=[AppUserRole.user_id, AppUserRole.role_id],
                             back_populates="roles")
    
    
    class AppUser(Base):
        ...
        roles = relationship("AppRole", secondary="app_user_role",
                             foreign_keys=[AppUserRole.user_id, AppUserRole.role_id],
                             back_populates="users")
    

    【讨论】:

    • 这行得通!谢谢。但是,我虽然back_populates 通常指向table/class/model,在这种情况下,关系已定义的含义我会认为对于 AppRole 它将是 back_populates="app_role" 而对于 AppUser 表它将是 back_populates="app_user"?
    • @lukik 不,应该是对面关系的名字,而不是表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多