使用 SQLAlchemy 0.7.1 和 MySQL 5.1 数据库,我建立了一个多对多关系,如下所示:
user_groups = Table('user_groups', Base.metadata,
Column('user_id', String(128), ForeignKey('users.username')),
Column('group_id', Integer, ForeignKey('groups.id'))
)
class ZKUser(Base, ZKTableAudit):
__tablename__ = 'users'
username = Column(String(128), primary_key=True)
first_name = Column(String(512))
last_name = Column(String(512))
groups = relationship(ZKGroup, secondary=user_groups, backref='users')
class ZKGroup(Base, ZKTableAudit):
__tablename__ = 'groups'
id = Column(Integer, primary_key=True)
name = Column(String(512))
用户可以属于多个组,组可以包含多个用户。
我要做的是构建一个 SQLAlchemy 查询,该查询仅返回属于组列表中至少一个组的用户。
我玩过 in_
函数,但这似乎只适用于测试列表中成员资格的标量值。我不是一个 SQL 编写者,所以我什至不知道这需要什么样的 SELECT
语句。
最佳答案
好的,经过大量研究,我意识到是我自己对 SQL 术语的无知阻碍了我。我寻找属于“至少一个”组列表的用户的解决方案应该是找到属于“任何”组列表的用户。 SQLAlchemy 中的 any
ORM 函数正是我所需要的,如下所示:
session.query(ZKUser).filter(ZKUser.groups.any(ZKGroup.id.in_([1,2,3])))
该代码发出此 SQL(在 MySQL 5.1 上):
SELECT * FROM users
WHERE EXISTS (
SELECT 1 FROM user_groups, groups
WHERE users.id = user_groups.contact_id
AND groups.id = user_groups.group_id
AND groups.id IN (%s, %s, %s)
)
关于python - SQLAlchemy:按至少一个多对多相关表中的成员资格过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6474989/