sqlalchemy有几个到多个表连接

Pie*_*oth 10 python join sqlalchemy

新的SQLalchemy,这是我的问题:

我的模型是:

user_group_association_table = Table('user_group_association', Base.metadata,
    Column('user_id', Integer, ForeignKey('user.id')), 
    Column('group_id', Integer, ForeignKey('group.id'))    
)

department_group_association_table = Table('department_group_association', Base.metadata,
    Column('department', Integer, ForeignKey('department.id')), 
    Column('group_id', Integer, ForeignKey('group.id'))
)

class Department(Base):
    __tablename__ = 'department'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))


class Group(Base):
    __tablename__ = 'group'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    users = relationship("User", secondary=user_group_association_table, backref="groups")
    departments = relationship("Department", secondary=department_group_association_table, backref="groups")

class User(Base):

    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    firstname = Column(String(50))
    surname = Column(String(50))
Run Code Online (Sandbox Code Playgroud)

因此,此代码反映了以下关系:

   --------             ---------             --------------
   | User | --- N:M --- | Group | --- N:M --- | Department |
   --------             ---------             --------------
Run Code Online (Sandbox Code Playgroud)

我尝试使用连接但仍未成功执行以下操作:

一个sqlalchemy请求获取所有用户实例,同时知道一个部门名称(让我们说'研发')

这应该从以下开始:

session.query(User).join(...
or
session.query(User).options(joinedLoad(...
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

谢谢你的时间,

皮埃尔

Max*_*yko 23

session.query(User).join((Group, User.groups)) \
    .join((Department, Group.departments)).filter(Department.name == 'R&D')
Run Code Online (Sandbox Code Playgroud)

这也有效,但使用了一个子选择:

session.query(User).join((Group, User.groups)) \
    .filter(Group.departments.any(Department.name == 'R&D'))
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 1

为什么不创建一个表关系

实施后,获得您想要的:

list_of_rnd_users = [u for u in Users if 'R&D' in u.departments]
Run Code Online (Sandbox Code Playgroud)

其中 .departments 属性将是您的关系的属性。