sqlalchemy查询基于以前的日期?

时间:2012-07-29 19:24:18

标签: sqlalchemy

很抱歉,如果这是一个奇怪的问题,我一直在浏览sqlalchemy网站上的文档/教程,但我无法弄清楚如何执行此特定查询。

我的网站上有很多活动日期,一直持续到更改为止。我知道我可以查询特定日期或日期范围,但如果我查询日期(不存在),我可以获得上一场比赛吗?

例如说我有6月25日和6月30日,作为两个日期,我运行6月29日的查询。是否有可能只用一个查询获取6月25日的数据?我只想要输入日期的上一场比赛。

1 个答案:

答案 0 :(得分:1)

下面可能是您模型的简化版本,但希望该示例可以帮助您创建自己的查询。

假设模型定义如下,并且[Activity.person_id, Activity.date]是唯一的(基本上,每天只允许一个活动),查询使用子查询,返回元组(Person, _last_ Activity)

# MODEL:
class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String)
    activities = relationship('Activity', backref="person")

class Activity(Base):
    __tablename__ = 'activity'
    id = Column(Integer, primary_key=True, autoincrement=True)
    person_id = Column(Integer, ForeignKey('person.id'))
    name = Column(String)
    date = Column(Date)


# BUILDING THE QUERY
def get_latest_activity_before_or_at(last_date):
    AT = Activity.__table__
    q = (select([AT.c.person_id, func.max(AT.c.date).label("max_date")],
                (AT.c.date <= last_date)
                ).
            group_by(AT.c.person_id)).alias("subq")
    #print q

    #qry = session.query(Person, q).outerjoin(q, q.c.person_id == Person.id)
    qry = (session.query(Person).outerjoin(q, q.c.person_id == Person.id).
            outerjoin(Activity, and_(Activity.person_id == Person.id, Activity.date == q.c.max_date)))
    qry = qry.add_entity(Activity)
    return qry.all()

# TESTING the query:
last_date = datetime.date(2012, 7, 3)
res = get_latest_activity_before_or_at(last_date)
for x in res:
    print x