2009-12-30 13 views
9

के लिए सरणी के लिए psycopg2 पैरामीटर निर्दिष्ट करने के लिए कैसे करें मैं psycopg2 का उपयोग करके पायथन में एक पोस्टग्रेएसक्यूएल क्वेरी चलाने के लिए चाहता हूं, जो timestamp without timezone के कॉलम द्वारा फ़िल्टर करता है। मैं आसानी से सरणियों संभालती टाइमस्टैम्प (बजाय एक सीमा) और psycopg2 के मूल्यों को अनुमति की एक लंबी सूची है, तो मैंने सोचा था कि यह काम करना चाहिए:टाइमस्टैम्प (डेटाटाइम)

SELECT somestuff 
FROM mytable 
WHERE thetimestamp = ANY (%(times)s) 

times पैरामीटर datetime वस्तुओं की एक सूची है। मैंने psycopg2.Timestamp() भी कोशिश की है। वे दोनों WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...]) करने के लिए अनुवाद और दुर्भाग्य से जो निम्न त्रुटि के साथ विफल:

operator does not exist: timestamp without time zone = text 
LINE 3: WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...] 
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

मैं भी pgAdmin में इस की पुष्टि की है, तो यह सिर्फ psycopg2 नहीं है। ऐसा प्रतीत होता है कि पोस्टग्रेस समय-समय पर तारों की सरणी में तारों की सरणी को रूपांतरित नहीं करेगा। यह एक स्ट्रिंग जुर्माना को कन्वर्ट करेगा और सरणी ठीक काम करती है अगर मैं स्पष्ट रूप से ::timestamp को pgAdmin में प्रत्येक तत्व में जोड़ता हूं, लेकिन मुझे नहीं पता कि psycopg2 में ऐसा कैसे करें।

डीबी-एपीआई पैरामीटर को भूलने और मैन्युअल रूप से टाइमस्टैम्प की लंबी स्ट्रिंग बनाने के अलावा, ऐसा करने का सबसे अच्छा तरीका क्या है? क्या कोई तरीका है कि मैं इसे सही प्रकार पर डालने के लिए प्राप्त कर सकता हूं? ,

SELECT somestuff 
FROM mytable 
WHERE thetimestamp = ANY (%(times)s::timestamp[]) 

उत्तर

12

इस तरह यह कोशिश करो।

कारण यह नहीं था कि यह psycopg2 कार्यान्वयन में एक बग था। सुझाए गए कामकाज को SQL में स्पष्ट रूप से डालने के लिए था, जैसा कि किसी अन्य उत्तर में सुझाया गया था।

3

आप psycopg2 संस्करण 2.2.0 या नए, अपने मूल कोड काम करना चाहिए, यदि आप Timestamp() कंस्ट्रक्टर्स में मानों लपेटो का उपयोग करते हैं, जैसा कि आप का सुझाव दिया:

संबंधित मुद्दे