PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy vấn sqlalchemy trong Python postgreSQL một cột DATERANGE

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 lowerupper 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bản cập nhật Lion đã xóa người dùng 'postgres'. Làm thế nào để khôi phục lại nó?

  2. lưu trữ kết quả postgresql trong biến bash

  3. psql:FATAL:cơ sở dữ liệu <người dùng> không tồn tại

  4. cột postgres X không tồn tại

  5. Làm thế nào để cập nhật bảng từ bảng liên kết?