2011-12-28 12 views
56

का समर्थन नहीं करता है। मैं एसक्लैल्मी का उपयोग करके पीजी डेटाबेस से डेटा लाने के लिए हाथ से तैयार एसक्यूएल का उपयोग कर रहा हूं। मैं एक प्रश्न जो ऑपरेटर की तरह एसक्यूएल शामिल कोशिश कर रहा हूँ '%' और कहा कि एक पाश के माध्यम से SqlAlcjhemy फेंक लगता है:अजीब SQLAlchemy त्रुटि संदेश: TypeError: 'dict' ऑब्जेक्ट इंडेक्सिंग

sql = """ 
     SELECT DISTINCT u.name from user u 
     INNER JOIN city c ON u.city_id = c.id 
     WHERE c.designation=upper('fantasy') 
     AND c.id IN (select id from ref_geog where short_name LIKE '%opt') 
     """ 

# The last line in the above statement throws the error mentioned in the title. 
# However if the last line is change to: 
# AND c.id IN (select id from ref_geog where short_name = 'helloopt') 
# the script runs correctly. 
# 
# I also tried double escaping the '%' i.e. using '%%' instead - that generated the same error as previously. 

connectDb() 
res = executeSql(sql) 
print res 
closeDbConnection() 

कोई नहीं जानता कि इस भ्रामक त्रुटि संदेश उत्पन्न कर रहा है और मैं इसे कैसे ठीक कर सकता है?

[[संपादित करें]]

से पहले किसी भी एक पूछता है, वहाँ विशेष या फैंसी कुछ भी नहीं कार्यों के बारे में ऊपर शामिल थे। उदाहरण के लिए फ़ंक्शन executeSql() बस conn.execute (sql) को आमंत्रित करता है और परिणाम देता है। परिवर्तनीय शंकु डेटाबेस से पहले स्थापित स्थापित कनेक्शन है।

+0

क्या आप 'executeSql (...) 'का कोड पोस्ट कर सकते हैं? और, क्या आपके पास वास्तव में 'SELECT' कथन में 'वापसी * ​​है'? – van

+0

@van मुझे वह याद आया। एसक्यूएल में कोई 'रिटर्निंग *' नहीं है जो समस्या पैदा कर रहा है। मैं सवाल सही कर देंगे। –

+1

यह उत्तर है [http://stackoverflow.com/questions/3944276/psycopg2-using-wildcard-causes-typeerror] सहायक? – van

उत्तर

4

ऐसा लगता है कि आपकी समस्या this bug से संबंधित हो सकती है।

इस मामले में, आपको कामकाज के रूप में तीन गुना भागना चाहिए।

91

आप क्योंकि अजगर में % तो स्वरूपण जब आप एक % बारे में स्ट्रिंग के रूप में इस्तेमाल होता है %% देने के लिए % के रूप में उपयोग करने के लिए है इसकी कल्पना करते हैं कि आप इस के साथ कुछ मूल्य को बदलने के लिए जा रहे हैं।

तो जब आप क्वेरी के साथ स्ट्रिंग में सिंगल % रखना चाहते हैं तो सभी जगहें % रखें।

+3

मेरी इच्छा है कि वे उस त्रुटि संदेश को अपडेट करेंगे, हर बार जब मैं इसे प्राप्त करता हूं तो मैं इस पृष्ठ पर लैंडिंग समाप्त करता हूं और – oshi2016

28

SQLAlchemy में टेक्स्ट लपेटने के लिए एक टेक्स्ट फ़ंक्शन है जो आपके लिए SQL से सही ढंग से बचने के लिए प्रतीत होता है।

अर्थात

res = executeSql(sqlalchemy.text(sql)) 

आप के लिए काम करते हैं और अजीब एस्केपिंग क्या करने वाले से आप को बचाने के लिए करना चाहिए।

+2

का उत्तर देता हूं यह चयनित उत्तर होना चाहिए। इसने मेरे मामले में इस मुद्दे को हल किया। –

+0

ध्यान दें कि यह टिप्पणियों से बच नहीं है, लेकिन अन्यथा एक शानदार समाधान है। – ClimbsRocks

0

यह भी मामले से हो सकता है - पर एसक्यूएल dict वह स्वरूप घोषित किये गए हैं और सूची या TUPPLE के रूप में एसक्यूएल में चालाकी से किया जा रहा है मामला मानकों में पारित किया जाना है। ,

c.execute("SELECT * FROM t WHERE a = %s") 

दूसरे शब्दों में यदि आप क्वेरी में पैरामीटर (%s) प्रदान करते हैं, लेकिन आप क्वेरी पैरामीटर जोड़ने के लिए भूल जाते हैं:

1

मैं एक और मामला पाया जब इस त्रुटि दिखाई देता है। इस मामले में त्रुटि संदेश बहुत भ्रामक है।

0

एक और नोट- आपको टिप्पणियों में % वर्णों से बचाना होगा (या हटाएं)। दुर्भाग्य से, sqlalchemy.text(query_string) टिप्पणी में प्रतिशत चिह्न से बच नहीं करता है।

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