Запрос
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()
может быть реализован с использованием оператора "range hasable" <@
.Чтобы передать правильный операнд, вы должны создать экземпляр psycopg2.extras.DateRange
, который представляет значение Postgresql daterange
в Python:
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-кода;единственное, что может произойти, это то, что литерал имеет неверный синтаксис для daterange
.В качестве альтернативы вы можете передать границы конструктору диапазона :
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
(the_daterange_lower, the_daterange_upper))
В общем, проще использовать типы Psycopg2 Range
и позволить им обрабатывать детали.