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
.