sql >> Database >  >> RDS >> PostgreSQL

Python postgreSQL sqlalchemy query een kolom DATERANGE

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.




  1. Gebruik OBJECTPROPERTY() om te bepalen of een object een weergave is in SQL Server

  2. MySQL Gson-datum invoegen

  3. 7 manieren om uw Oracle-versie te controleren

  4. Deepdive-installatie, PostgreSQL-fout