PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

अजगर में postgresql कथन के लिए पैरामीटर पास करने के लिए एक शब्दकोश का उपयोग करना

दस्तावेज़ में बताए अनुसार कृपया पैरामीटरयुक्त क्वेरी का उपयोग करें

चूंकि आपके पास पहले से ही एक निर्देश है, आप यह कर सकते हैं:

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 के लिए दस्तावेज़ीकरण है मॉड्यूल



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL शीर्ष शिक्षण और प्रशिक्षण संसाधन

  2. पोस्टग्रेज़ प्रारंभ में परिकलित मानों के साथ कॉलम जोड़ते हैं

  3. बाहरी पुस्तकालयों के साथ Google क्लाउड ऐप इंजन पर Django प्रोजेक्ट परिनियोजित करें

  4. PostgreSQL त्रुटि:पुनर्प्राप्ति के साथ विरोध के कारण कथन रद्द करना

  5. उपनाम द्वारा आदेश काम नहीं कर रहा