Dotaz
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()
lze implementovat pomocí operátoru "rozsah je obsažen" <@
. Abyste mohli předat správný operand, musíte vytvořit instanci psycopg2.extras.DateRange
, což představuje daterange
Postgresql hodnota v Pythonu:
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()
Všimněte si, že atributy lower
a upper
jsou součástí psycopg2.extras.Range
typy. Typy sloupců rozsahu SQLAlchemy neposkytují takové, jak uvádí vaše chyba.
Pokud chcete použít nezpracovaný SQL a předat rozsahy dat, můžete použít stejný DateRange
objektů, které mají také předávat hodnoty:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s',
(DateRange(the_daterange_lower, the_daterange_upper),))
Můžete také sestavit literály ručně , pokud chcete:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s::daterange',
(f'[{the_daterange_lower}, {the_daterange_upper})',))
Trik je sestavit literál v Pythonu a předat jej jako jedinou hodnotu – pomocí zástupných symbolů, jako vždy. Mělo by se vyhnout jakýmkoliv možnostem vkládání SQL; jediná věc, která se může stát, je, že literál má neplatnou syntaxi pro daterange
. Případně můžete předat hranice konstruktor rozsahu
:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
(the_daterange_lower, the_daterange_upper))
Celkově vzato je jednodušší použít Psycopg2 Range
typy a nechte je, aby si s nimi poradili.