python - SQLAlchemy:按至少一个多对多相关表中的成员资格过滤

标签 python mysql many-to-many sqlalchemy

使用 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/

相关文章:

c# - nHibernate 多对多映射只删除关联

python - 导入函数带来错误: name not defined

python - 从不接受信号的卡住 python 进程中获取堆栈跟踪

Python与C交互——回调函数

php - 如何在 Codeigniter 中使用 except 代码进行选择

php - 查找两个日期之间的条目数

c# - 如何从多对多关系中检索实体列表?

python - 如何执行 shell 命令来填充 Jenkins 动态选择参数插件

MYSQL 忽略重复值并获取唯一计数

django - 如何要求 Django 多关系管理器同时匹配多个关系?