sql >> Databáze >  >> RDS >> PostgreSQL

Python postgreSQL sqlalchemy dotazuje sloupec DATERANGE

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.




  1. Jak používat zástupné znaky předpony jako '*abc' s match-against

  2. Funkce LOWER() v Oracle

  3. Jak přiřadit hodnotu data všem vráceným dotazům mysql

  4. MySQL:Nastavit na výchozí hodnotu při aktualizaci