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.