1 回答
TA贡献1818条经验 获得超8个赞
查询
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()
可以使用“范围由”操作符来实现<@。为了传递正确的操作数,您必须创建一个 的实例psycopg2.extras.DateRange,它代表daterangePython 中的 Postgresql值:
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()
请注意,属性lower和upper是psycopg2.extras.Range类型的一部分 。SQLAlchemy 范围列类型不提供此类,如您的错误状态。
如果您想使用原始 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 注入的可能性;唯一可能发生的事情是文字对于 a 的语法无效daterange。或者,您可以将边界传递给范围构造函数:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
(the_daterange_lower, the_daterange_upper))
总而言之,使用 Psycopg2Range类型并让它们处理细节更容易。
添加回答
举报