PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Python postgreSQL sqlalchemy прави заявка за колона DATERANGE

Заявката

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()

може да се реализира с помощта на оператора "обхват се съдържа от" <@ . За да подадете правилния операнд, трябва да създадете екземпляр на psycopg2.extras.DateRange , което представлява Postgresql daterange стойност в 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()

Обърнете внимание, че атрибутите lower и upper са част от psycopg2.extras.Range видове. Типовете колони с обхват на SQLAlchemy не предоставят такива, както гласи вашата грешка.

Ако искате да използвате необработен SQL и да подадете диапазони от дати, можете да използвате същия DateRange обекти, които също да предават стойности:

bookings = db_session.execute(
    'SELECT * FROM usersbookrooms WHERE booked_date && %s',
    (DateRange(the_daterange_lower, the_daterange_upper),))

Можете също да създадете литерали ръчно , ако искате:

bookings = db_session.execute(
    'SELECT * FROM usersbookrooms WHERE booked_date && %s::daterange',
    (f'[{the_daterange_lower}, {the_daterange_upper})',))

Номерът е да изградите литерала в Python и да го подадете като една стойност – като използвате контейнери, както винаги. Трябва да избягва всякакви възможности за SQL инжектиране; единственото нещо, което може да се случи, е че литералът има невалиден синтаксис за daterange . Като алтернатива можете да предадете границите на конструктор на диапазон :

bookings = db_session.execute(
    'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
    (the_daterange_lower, the_daterange_upper))

Като цяло е по-лесно просто да използвате Psycopg2 Range типове и ги оставете да обработват подробностите.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. грешка при кодиране на postgres в приложението sidekiq

  2. Sail.js множество връзки при стартиране

  3. Какво да търсите, ако вашата PostgreSQL репликация изостава

  4. SQL заявка за получаване на всички стойности, които едно изброяване може да има

  5. Проблеми при свързването на Pentaho Kettle/Spoon към Heroku PostgreSQL чрез SSL