Frågan
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()
skulle kunna implementeras med operatorn "omfång finns av" <@
. För att passera rätt operand måste du skapa en instans av >psycopg2.extras.DateRange
, som representerar ett Postgresql daterange
värde i 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()
Observera att attributen lower
och upper
är en del av psycopg2.extras.Range
typer. SQLAlchemy-intervallkolumntyperna tillhandahåller inte sådana, som ditt fel anger.
Om du vill använda rå SQL och passdatumintervall kan du använda samma DateRange
objekt för att även skicka värden:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s',
(DateRange(the_daterange_lower, the_daterange_upper),))
Du kan också bygga bokstaver manuellt , om du vill:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s::daterange',
(f'[{the_daterange_lower}, {the_daterange_upper})',))
Tricket är att bygga det bokstavliga i Python och skicka det som ett enda värde – med hjälp av platshållare, som alltid. Det bör undvika alla SQL-injektionsmöjligheter; Det enda som kan hända är att bokstaven har ogiltig syntax för ett daterange
. Alternativt kan du överföra gränserna till en räckviddskonstruktor
:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
(the_daterange_lower, the_daterange_upper))
Sammantaget är det lättare att bara använda Psycopg2 Range
typer och låt dem hantera detaljerna.