SQLAlchemy在()之间获取日期

时间:2015-04-19 04:45:21

标签: postgresql flask sqlalchemy flask-sqlalchemy

为什么此查询的日期超出()之间的范围。我正试着让飞机和他们预订一天。

例如:

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

1 个答案:

答案 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))
     )