SQLAlchemy - 获取具有匹配的列集的所有行

时间:2016-04-14 23:57:52

标签: python sqlalchemy flask-sqlalchemy

我有一张桌子

class Term(CommonFunctions, Base):
    __tablename__ = 'terms'

    id = Column(Integer, primary_key=True,autoincrement=True)
    term_begin = Column(Date, nullable=False)
    term_end = Column(Date)
    term_served = Column(Integer)  # term_number # calculatable?
    office_type_id = Column(Integer, ForeignKey(OfficeType.id))
    office_type = relationship('OfficeType', backref='terms')
    state_id = Column(Integer, ForeignKey(State.id))
    state = relationship('State', backref='terms')
    district_id = Column(Integer, ForeignKey(District.id))
    district = relationship('District', backref='terms')
    office_class = Column(Integer)
    # ... other fieldds

我正在尝试运行一个报告,以查找具有相同数据集的行的ID对(state_id,district_id,office_type_id,office_class) 对于特定日期范围内的特定office_type_id。

我现在的查询 - (institution = office_type_id)

date = request.args.get('date')
institution = request.args.get('institution')
term_alias = aliased(schema.Term)
composition = Session.query(schema.Term.id, term_alias.id).\
    filter(schema.Term.id != term_alias.id).\
    filter(schema.Term.office_class == term_alias.office_class).\
    filter(schema.Term.state_id == term_alias.state_id).\
    filter(schema.Term.office_type_id == term_alias.office_type_id).\
    filter(schema.Term.office_type_id == institution).\
    filter(schema.Term.office_class != 0).\
    filter(and_(schema.Term.term_begin <= date, or_(schema.Term.term_end >= date,
                                                                          schema.Term.term_end == None))).\
    all()

这在某种意义上是有效的。我得到了有效的结果,但它重现了两次结果,对于每一个版本的一次。

例如:

[(127,196), (196,127)]

我的问题是,如何更新查询,仅包括尚未由逻辑等效对表示的对。

我希望上述设置为[(127, 196)][(196,127)],而不是两者。

感谢您阅读

1 个答案:

答案 0 :(得分:1)

一种常见的方法是强加一个特定的(任意)排序:

Session.query(...).filter(..., schema.Term.id < term_alias.id)

如果你可以找回一对“反身”对(一对相同的ID),你也需要应用一个不同的。

Session.query(...).filter(..., schema.Term.id < term_alias.id).distinct()