sql >> Databasteknik >  >> RDS >> PostgreSQL

Python postgreSQL sqlalchemy fråga en DATERANGE kolumn

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.




  1. är infogning baserad på val på en av kolumnerna i MySQL möjligt?

  2. Databasfailover för WordPress-webbplatser

  3. Fönsterfunktion i MySQL-frågor

  4. Hur man lägger till sök- och filterkriterier i Yii