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