在sqlalchemy中查询ManyToMany?

时间:2013-12-05 03:26:17

标签: python sqlalchemy

在sqlalchemy中,模型如下:

class User(Base):
    id = Column(IdDataType, primary_key=True)
    name = Column(Unicode(50))
class Group(Base):
    id = Column(IdDataType, primary_key=True)
    name = Column(Unicode(50))
    members = relationship('User', secondary='group_members', backref='memeber_groups')

group_members = Table('group_members', Base.metadata,
    Column('group_id', IdDataType, ForeignKey('group.id')),
    Column('user_id', IdDataType, ForeignKey('user.id')),
    Column('join_time', DateTime, default=datetime.now)
)

UserGroup是多种关系,现在我想找到count(users) group.id=3join_timebetween now and preivew week,如何在sqlalchemy中创建这个SQL

1 个答案:

答案 0 :(得分:0)

这更像是一个关联对象,而不是直接的多对多关系,所以我将其设置为:

class User(Base):
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(50), nullable=False, unique=True)


class Group(Base):
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(50), nullable=False, unique=True)


class Membership(Base):
    user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    group_id = Column(Integer, ForeignKey(Group.id), primary_key=True)
    joined_on = Column(DateTime, nullable=False, default=datetime.utcnow, server_default=func.current_timestamp())

    user = relationship(User, backref=backref('memberships', collection_class=set))
    group = relationship(Group, backref=backref('memberships', collection_class=set))


User.groups = association_proxy('memberships', 'group')
Group.users = association_proxy('memberships', 'user')

查询如下所示:

session.query(Membership.user_id).filter(Membership.group_id == 3, Membership.joined_on.between(previous, now)).count()
相关问题