PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Python postgreSQL sqlalchemy meminta kolom DATERANGE

Kueri

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

dapat diimplementasikan menggunakan operator "rentang dikandung oleh" <@ . Untuk melewatkan operan yang tepat, Anda harus membuat instance psycopg2.extras.DateRange , yang mewakili daterange Post Postgresql nilai dalam 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()

Perhatikan bahwa atribut lower dan upper adalah bagian dari psycopg2.extras.Range jenis. Jenis kolom rentang SQLAlchemy tidak menyediakan hal tersebut, seperti yang dinyatakan kesalahan Anda.

Jika Anda ingin menggunakan SQL mentah dan meneruskan rentang tanggal, Anda dapat menggunakan DateRange yang sama objek untuk memberikan nilai juga:

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

Anda juga dapat membuat literal secara manual , jika Anda ingin:

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

Triknya adalah membangun literal dalam Python dan meneruskannya sebagai nilai tunggal – menggunakan placeholder, seperti biasa. Itu harus menghindari kemungkinan injeksi SQL; satu-satunya hal yang dapat terjadi adalah literal memiliki sintaks yang tidak valid untuk daterange . Atau, Anda dapat meneruskan batas ke konstruktor rentang :

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

Secara keseluruhan lebih mudah menggunakan Range Psycopg2 ketik dan biarkan mereka menangani detailnya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL tsrange:apakah benar lower_inf('(-infinity,today)'::tsrange) salah?

  2. Apa perbedaan antara tanda kutip tunggal dan tanda kutip ganda di PostgreSQL?

  3. lastInsertId tidak berfungsi di Postgresql

  4. Menerapkan NULLS PERTAMA di Amazon Redshift

  5. Bagaimana cara menerjemahkan PostgreSQL OID menggunakan python