आप एक टेबल नाम को पैरामीटर के रूप में पास करने का प्रयास कर रहे हैं। आप शायद इसे तुरंत देख सकते थे यदि आपने अभी-अभी PostgreSQL त्रुटि लॉग को देखा होता।
जिस तालिका नाम को आप psycopg2 से एक पैरामीटर के रूप में पास करने का प्रयास कर रहे हैं, वह बच निकला जा रहा है, जैसे:
INSERT INTO E'my_table'(name, url, id, point_geom, poly_geom) VALUES (E'ST_GeomFromText(''POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))'',4326)');'
यह आपका इरादा नहीं है और यह काम नहीं करेगा; आप एक टेबल नाम से शाब्दिक की तरह बच नहीं सकते हैं। डायनामिक एसक्यूएल बनाने के लिए आपको सामान्य पायथन स्ट्रिंग इंटरपोलेशन का उपयोग करना चाहिए, आप केवल वास्तविक शाब्दिक मूल्यों के लिए पैरामीटरयुक्त स्टेटमेंट प्लेसहोल्डर का उपयोग कर सकते हैं।
params = ('POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))',4326)
escaped_name = name.replace('"",'""')
curs.execute('INSERT INTO "%s"(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%%s,%%s));' % escaped_name, params)
देखें कि मैंने क्वेरी स्ट्रिंग बनाने के लिए सीधे नाम को कैसे प्रक्षेपित किया है:
INSERT INTO my_table(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s));
(%%
सादे %
. में परिवर्तित हो जाता है % प्रतिस्थापन द्वारा)। फिर मैं उस क्वेरी का उपयोग POLYGON
. को परिभाषित करने वाली स्ट्रिंग के साथ कर रहा हूं और दूसरा तर्क ST_GeomFromText
क्वेरी पैरामीटर के रूप में।
मैंने इसका परीक्षण नहीं किया है, लेकिन यह आपको सही विचार देगा और यह समझाने में मदद करेगा कि क्या गलत है।
अत्यंत सावधान रहें इस तरह स्ट्रिंग इंटरपोलेशन करते समय, यह SQL इंजेक्शन के लिए एक आसान तरीका है। मैंने ऊपर दिखाए गए कोड में बहुत कच्चा उद्धरण दिया है, लेकिन यदि आपकी क्लाइंट लाइब्रेरी एक प्रदान करती है तो मैं एक उचित पहचानकर्ता उद्धरण फ़ंक्शन का उपयोग करना चाहता हूं।