为什么此查询的日期超出()之间的范围。我正试着让飞机和他们预订一天。
例如:
print start
2015-04-17T00:00
print end
2015-04-17T23:59
查询:
planes = Plane.query.filter(Booking.start_date.between(start, end))
for p in planes:
plane = p.as_dict()
bookings = []
for b in p.bookings:
booking = b.as_dict()
print booking['start_date']
结果:
2015-04-17 02:30:00
2015-04-16 03:00:00
2015-04-16 02:30:00
2015-04-17 05:30:00
答案 0 :(得分:2)
如果启用了生成的SQL语句的日志记录,您将看到您的查询缺少join
子句。为了解决这个问题,您需要确保分别在每个平面的预订上过滤 ,这就像在查询中添加join(...)
一样简单:
q = (session.query(Plane)
.join(Booking)
.filter(Booking.start_date.between(start, end))
)
这将返回具有至少特定日期范围的预订的飞机。但是,当您通过关系(p.bookings
)访问其预订时,迭代飞机,sqlalchemy
将为每个广告加载所有预订。
如果您真的只想 过滤预订,您必须再次进行过滤(对于小数据大小,这是OKEY),或者您可以使用contains_eager
来实现此目的。
请参阅Querying related tables in sqlalchemy如何做到这一点,但基本上你最终会得到:
q = (session.query(Plane)
.join(Booking)
.filter(Booking.start_date.between(start, end))
.options(contains_eager(Plane.bookings))
)