Заявката
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
, което представлява 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
типове и ги оставете да обработват подробностите.