Python postgreSQL sqlalchemy查询日期范围列

Python postgreSQL sqlalchemy查询日期范围列,python,sql,postgresql,sqlalchemy,date-range,Python,Sql,Postgresql,Sqlalchemy,Date Range,我有一个预订系统,我将预订的日期范围保存在日期范围列中: booked_date = Column(DATERANGE(), nullable=False) 我已经知道我可以使用booked\u date访问实际日期。较低的或booked\u date。较高的 例如,我在这里这样做: for bdate in room.RoomObject_addresses_UserBooksRoom: unaviable_ranges['ranges'].append([str(bdate.bo

我有一个预订系统,我将预订的日期范围保存在日期范围列中:

booked_date = Column(DATERANGE(), nullable=False)
我已经知道我可以使用
booked\u date访问实际日期。较低的
booked\u date。较高的

例如,我在这里这样做:

for bdate in room.RoomObject_addresses_UserBooksRoom: 
    unaviable_ranges['ranges'].append([str(bdate.booked_date.lower),\
    str(bdate.booked_date.upper)])
现在我需要按给定的日期范围筛选我的预订。例如,我想查看2018年1月1日至2018年1月10日之间的所有预订

通常它很简单,因为日期可以这样比较:
date查询

the_daterange_lower = datetime.strptime(the_daterange[0], '%d.%m.%Y')
the_daterange_upper = datetime.strptime(the_daterange[1], '%d.%m.%Y')

bookings = UserBooks.query.\
    filter(UserBooks.booked_date.lower >= the_daterange_lower,
           UserBooks.booked_date.upper <= the_daterange_upper).\
    all()
请注意,属性
lower
upper
是类型的一部分。SQLAlchemy range列类型不提供错误状态所述的类型


如果要使用原始SQL和传递日期范围,也可以使用相同的
DateRange
对象传递值:

bookings = db_session.execute(
    'SELECT * FROM usersbookrooms WHERE booked_date && %s',
    (DateRange(the_daterange_lower, the_daterange_upper),))
如果愿意,您还可以:

bookings = db_session.execute(
    'SELECT * FROM usersbookrooms WHERE booked_date && %s::daterange',
    (f'[{the_daterange_lower}, {the_daterange_upper})',))
诀窍是在Python中构建文本并将其作为单个值传递——一如既往地使用占位符。它应该避免任何SQL注入的可能性;唯一可能发生的事情是,该文本对于
daterange
具有无效语法。或者,您可以将边界传递给:


总之,只需使用Psycopg2
范围
类型并让它们处理细节就更容易了。

,因此,如果您需要生成这些类型以用作查询中的值,请阅读它们的文档。另外,如果使用SQLAlchemy而不是原始SQL,请检查其范围运算符支持:我知道这一点。你链接到的问题也是我的问题。也许我错过了什么,所以我会重读所有的东西。但我认为.lower和.upper应该适用于我的情况。感谢
日期范围的提示。我仍然有一些问题,但我想我现在可以继续前进了。我对时区有一个问题,因为我得到:
sqlalchemy.exc.ProgrammingError:datetime.strptime
生成
datetime
对象,不是
日期
对象。添加了对
date()
的调用以匹配类型。不要这样做,它现在就可以工作了
un\u daterange=daterange(较低的daterange.date(),较高的daterange.date())
。非常感谢,你已经帮了我很多次了。
bookings = db_session.execute('SELECT * FROM usersbookrooms WHERE booked_date && [' + str(the_daterange_lower) + ',' + str(the_daterange_upper) + ')')
the_daterange_lower = datetime.strptime(the_daterange[0], '%d.%m.%Y')
the_daterange_upper = datetime.strptime(the_daterange[1], '%d.%m.%Y')

bookings = UserBooks.query.\
    filter(UserBooks.booked_date.lower >= the_daterange_lower,
           UserBooks.booked_date.upper <= the_daterange_upper).\
    all()
the_daterange_lower = datetime.strptime(the_daterange[0], '%d.%m.%Y').date()
the_daterange_upper = datetime.strptime(the_daterange[1], '%d.%m.%Y').date()

the_daterange = DateRange(the_dateranger_lower, the_daterange_upper)

bookings = UserBooks.query.\
    filter(UserBooks.booked_date.contained_by(the_daterange)).\
    all()
bookings = db_session.execute(
    'SELECT * FROM usersbookrooms WHERE booked_date && %s',
    (DateRange(the_daterange_lower, the_daterange_upper),))
bookings = db_session.execute(
    'SELECT * FROM usersbookrooms WHERE booked_date && %s::daterange',
    (f'[{the_daterange_lower}, {the_daterange_upper})',))
bookings = db_session.execute(
    'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
    (the_daterange_lower, the_daterange_upper))