De vraag
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()
kan worden geïmplementeerd met de operator "bereik is opgenomen door" <@
. Om de juiste operand door te geven, moet u een instantie maken van psycopg2.extras.DateRange
, wat staat voor een Postgresql daterange
waarde in 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()
Merk op dat de attributen lower
en upper
maken deel uit van de psycopg2.extras.Range
soorten. De kolomtypes van het SQLAlchemy-bereik bieden dit niet, zoals uw fout aangeeft.
Als u onbewerkte SQL wilt gebruiken en datumbereiken wilt doorgeven, kunt u dezelfde DateRange
gebruiken objecten om ook waarden door te geven:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s',
(DateRange(the_daterange_lower, the_daterange_upper),))
Je kunt ook letterlijk handmatig bouwen , als je wilt:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s::daterange',
(f'[{the_daterange_lower}, {the_daterange_upper})',))
De truc is om de letterlijke waarde in Python te bouwen en deze als een enkele waarde door te geven - zoals altijd met tijdelijke aanduidingen. Het zou alle mogelijkheden voor SQL-injectie moeten vermijden; het enige dat kan gebeuren is dat de letterlijke syntaxis een ongeldige syntaxis heeft voor een daterange
. Als alternatief kunt u de grenzen doorgeven aan een bereikconstructor
:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
(the_daterange_lower, the_daterange_upper))
Al met al is het gemakkelijker om gewoon de Psycopg2 Range
te gebruiken typen en laat ze de details afhandelen.