首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQLAlchemy:至少在一个多对多相关表中按成员资格进行筛选

SQLAlchemy:至少在一个多对多相关表中按成员资格进行筛选
EN

Stack Overflow用户
提问于 2011-06-25 08:25:29
回答 2查看 24.2K关注 0票数 32

使用SQLAlchemy 0.7.1和MySQL 5.1数据库,我建立了一个多对多关系,如下所示:

代码语言:javascript
复制
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语句。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-29 04:19:17

好吧,经过大量的研究后,我意识到是我自己对SQL术语的无知阻碍了我的脚步。我对查找属于组列表中“至少一个”的用户的解决方案的搜索应该是查找属于组列表中的“任何”的用户。来自SQLAlchemy的any ORM函数做的正是我所需要的,如下所示:

代码语言:javascript
复制
session.query(ZKUser).filter(ZKUser.groups.any(ZKGroup.id.in_([1,2,3])))

该代码发出以下SQL (在MySQL 5.1上):

代码语言:javascript
复制
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)
    )
票数 61
EN

Stack Overflow用户

发布于 2011-06-25 11:15:28

您可以使用in_

代码语言:javascript
复制
session.query(ZKUser).filter(ZKGroup.id.in_([1,2])).all()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6474989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档