दस्तावेज़ में बताए अनुसार कृपया पैरामीटरयुक्त क्वेरी का उपयोग करें
चूंकि आपके पास पहले से ही एक निर्देश है, आप यह कर सकते हैं:
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)
मैंने परीक्षण नहीं किया है कि क्या एक odered dict के साथ काम करता है, लेकिन मुझे लगता है कि इसे करना चाहिए। यदि नहीं, तो आप अपने आदेशित निर्देश को पैरामीटर मैपिंग के रूप में पारित करने से पहले एक नियमित निर्देश बना सकते हैं।
संपादित करें जब तक आपको बाद में ऑर्डर किए गए डिक्ट होने के लिए अपने पैरामीटर की आवश्यकता न हो, तब तक नियमित निर्देश का उपयोग करें। जहां तक मैं देख सकता हूं, आपने list(query_params.values())[0]
के लिए वैल्यू ऑर्डर को संरक्षित करने के लिए केवल एक OrderedDict का विकल्प चुना है। ।
EDIT2 बाइंडिंग का उपयोग करके तालिका के नाम और फ़ील्ड नाम पारित नहीं किए जा सकते। एंटोनी ड्यूसेक्स ने इस उत्तर में बताया कि psycopg2 संस्करण 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)
आपको table_name
को हटाना पड़ सकता है आपके निर्देश से, मुझे यकीन नहीं है कि पैरामीटर में अतिरिक्त वस्तुओं पर psycopg2 कैसे प्रतिक्रिया करता है और मैं अभी इसका परीक्षण नहीं कर सकता।
यह इंगित किया जाना चाहिए, कि यह अभी भी SQL इंजेक्शन के जोखिम का कारण बनता है और जब तक बिल्कुल आवश्यक न हो, इससे बचा जाना चाहिए। आम तौर पर, टेबल और फ़ील्ड नाम क्वेरी स्ट्रिंग का एक निश्चित हिस्सा होते हैं।
यहां प्रासंगिक sql
के लिए दस्तावेज़ीकरण है मॉड्यूल
।