抱歉,如果这是一个奇怪的问题,我一直在浏览 sqlalchemy 网站上的文档/教程,但我不知道如何进行这个特定的查询。
我的网站上有一堆活动日期,这些日期一直持续到更改为止。我知道我可以查询特定日期或日期范围,但是如果我查询一个日期(不存在),我可以得到上一个匹配项吗?
例如,假设我有 6 月 25 日和 6 月 30 日作为两个日期,我运行 6 月 29 日的查询。是否可以仅通过一个查询获取 6 月 25 日的数据?我只想要我输入的日期的上一场比赛。
抱歉,如果这是一个奇怪的问题,我一直在浏览 sqlalchemy 网站上的文档/教程,但我不知道如何进行这个特定的查询。
我的网站上有一堆活动日期,这些日期一直持续到更改为止。我知道我可以查询特定日期或日期范围,但是如果我查询一个日期(不存在),我可以得到上一个匹配项吗?
例如,假设我有 6 月 25 日和 6 月 30 日作为两个日期,我运行 6 月 29 日的查询。是否可以仅通过一个查询获取 6 月 25 日的数据?我只想要我输入的日期的上一场比赛。
下面可能是您的模型的简化版本,但希望该示例将帮助您创建自己的查询。
假设模型定义如下,并且[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