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

Sử dụng từ điển để chuyển các tham số cho câu lệnh postgresql trong python

Vui lòng sử dụng truy vấn được tham số hóa như được mô tả trong tài liệu

Vì bạn đã có một câu chính tả, bạn có thể làm:

sql_data_sample = """select * from %(table_name)s
           where dt = %(date_from)s
           and target in ('ACTIVE')
           ----------------------------------------------------
           union all
           ----------------------------------------------------
           (select * from %(table_name)s
           where dt = %(date_to)s
           and target in (%(class_target)s));"""

cur.execute(sql_data_sample, query_params)

Tôi chưa kiểm tra xem liệu có hoạt động với một câu lệnh có mùi hay không, nhưng tôi nghĩ nó nên làm như vậy. Nếu không, bạn có thể đặt lệnh dict thông thường trước khi chuyển nó dưới dạng ánh xạ tham số.

CHỈNH SỬA Trừ khi bạn cần các tham số của mình để trở thành một OrderedDict sau này, hãy sử dụng một chính tả thông thường. Theo như tôi thấy, bạn chỉ chọn một OrderedDict để duy trì thứ tự giá trị cho danh sách list(query_params.values())[0] .

EDIT2 Tên bảng và tên trường không thể được chuyển bằng cách sử dụng các liên kết. Antoine Dusséaux đã chỉ ra trong câu trả lời này rằng psycopg2 cung cấp một cách an toàn hơn hoặc ít hơn để làm điều đó kể từ phiên bản 2.7.

from psycopg2 import sql

sql_data_sample = """select * from {0}
           where dt = %(date_from)s
           and target in ('ACTIVE')
           ----------------------------------------------------
           union all
           ----------------------------------------------------
           (select * from {0}
           where dt = %(date_to)s
           and target in (%(class_target)s));"""

cur.execute(sql.SQL(sql_data_sample)
                .format(sql.Identifier(query_params['table_name'])), 
            query_params)

Bạn có thể phải xóa table_name từ dict của bạn, tôi không chắc psycopg2 phản ứng như thế nào trên các mục bổ sung trong tham số dict và tôi không thể kiểm tra nó ngay bây giờ.

Cần phải chỉ ra rằng điều này vẫn có nguy cơ bị tiêm SQL và nên tránh trừ khi thực sự cần thiết. Thông thường, tên bảng và trường là một phần khá cố định của chuỗi truy vấn.

Đây là tài liệu liên quan cho sql mô-đun .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giúp Quản lý Cơ sở dữ liệu Sản xuất PostgreSQL dễ dàng hơn

  2. Kích hoạt để cập nhật ngày hiện tại trong Postgres 9

  3. Cách tạo người dùng với pgAdmin

  4. xử lý đường ray + postgres và múi giờ

  5. Postgresql:Xuất CSV có dấu ngắt dòng thoát