Truy vấn
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()
có thể được triển khai bằng cách sử dụng "dải ô được chứa bởi" toán tử <@
. Để chuyển đúng toán hạng, bạn phải tạo một bản sao của psycopg2.extras.DateRange
, đại diện cho một Postgresql daterange
giá trị trong 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()
Lưu ý rằng các thuộc tính lower
và upper
là một phần của psycopg2.extras.Range
các loại. Các loại cột phạm vi SQLAlchemy không cung cấp các trạng thái lỗi như vậy.
Nếu bạn muốn sử dụng SQL thô và vượt qua phạm vi ngày, bạn có thể sử dụng cùng một DateRange
các đối tượng để chuyển các giá trị:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s',
(DateRange(the_daterange_lower, the_daterange_upper),))
Bạn cũng có thể tạo các ký tự theo cách thủ công , nếu bạn muốn:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && %s::daterange',
(f'[{the_daterange_lower}, {the_daterange_upper})',))
Bí quyết là xây dựng ký tự trong Python và chuyển nó dưới dạng một giá trị duy nhất - sử dụng trình giữ chỗ, như mọi khi. Nó sẽ tránh bất kỳ khả năng chèn SQL nào; điều duy nhất có thể xảy ra là chữ có cú pháp không hợp lệ cho daterange
. Ngoài ra, bạn có thể vượt qua giới hạn cho hàm tạo phạm vi
:
bookings = db_session.execute(
'SELECT * FROM usersbookrooms WHERE booked_date && daterange(%s, %s)',
(the_daterange_lower, the_daterange_upper))
Nói chung, dễ dàng hơn khi chỉ sử dụng Psycopg2 Range
và để họ xử lý các chi tiết.