2009-11-14 10 views
16

मैं एक उदाहरण के रूप एसक्यूएल कार्यों का सरलतम ले लेंगे:psycopg2 मेरे किसी भी SQL फ़ंक्शन को निष्पादित क्यों नहीं कर रहा है? (IndexError: सीमा से बाहर टपल इंडेक्स)

CREATE OR REPLACE FUNCTION skater_name_match(INTEGER,VARCHAR) 
RETURNS BOOL AS 
$$ 
    SELECT $1 IN (SELECT skaters_skater.competitor_ptr_id FROM skaters_skater 
    WHERE name||' '||surname ILIKE '%'||$2||'%' 
    OR surname||' '||name ILIKE '%'||$2||'%'); 
$$ LANGUAGE SQL; 

अगर मैं कॉपी और psql (PostgreSQL के खोल) में पेस्ट करेंगे तो यह बिना किसी समस्या के कार्यान्वित ।

अगर मैं (एक वास्तविक डेटाबेस नाम और निश्चित रूप से उपयोगकर्ता के साथ) इस तरह अजगर कोड का एक टुकड़ा लिखें:

import psycopg2 

sql_function_above = '''CREATE OR REPLACE FUNCTION skater_name_match(INTEGER,VARCHAR) 
RETURNS BOOL AS 
$$ 
    SELECT $1 IN (SELECT skaters_skater.competitor_ptr_id FROM skaters_skater 
    WHERE name||' '||surname ILIKE '%'||$2||'%' 
    OR surname||' '||name ILIKE '%'||$2||'%'); 
$$ LANGUAGE SQL;''' 

try: 
    connection = psycopg2.connect("dbname='x' user='x' host='localhost' password='x'"); 
except: 
    print "I am unable to connect to the database" 

cursor = connection.cursor() 
cursor.execute(sql_function_above) 

यह लगता (यह मुझे एक त्रुटि नहीं देता है) निष्पादित करने के लिए, लेकिन जब मैं डेटाबेस में देखता हूं तो फ़ंक्शन वहां नहीं होता है।

जब मैं syncdb के दौरान ऐप/एसक्यूएल/model.sql फ़ाइल मैं निम्नलिखित त्रुटि मिलती है में इसके सामने Django में कोड निष्पादित करने के लिए प्रयास करें:

IndexError: tuple index out of range 

जब मैं लिखने के लिए अपने खुद के प्रबंधन की कोशिश करो। py कमांड जो SQL को निष्पादित करेगा, मुझे एक ही त्रुटि मिलती है।

यहां क्या हो रहा है? इस पर कुछ प्रकाश डालने वाले किसी भी व्यक्ति के लिए बहुत आभारी रहेंगे :) जब भी पाइथन और डीजेगो की बात आती है, तब भी मैं नौसिखिया हूं, इसलिए मैंने कुछ स्पष्ट रूप से अनदेखा कर दिया होगा।

+1

क्या आप "कर्सर" में निष्पादित वास्तविक कथन जोड़ सकेंगे।निष्पादित करें (sql_function_above) "(या दिखाएं कि आपने 'sql_function_above' को परिभाषित किया है, यदि आप सचमुच उस पहचानकर्ता का उपयोग करना चाहते हैं)। –

+1

हमें दिखाएं कि आपने अपने पायथन कोड में sql_function_above 'को कैसे परिभाषित किया है। – nos

+0

क्षमा करें, यह मेरे हिस्से पर एक सरलीकरण था। विभिन्न अलग-अलग तरीकों से चर लिखने का प्रयास किया। मैंने एक एसक्यूएल फ़ाइल से पाठ को पढ़ने का भी प्रयास किया। इन सभी ने एक ही त्रुटि उत्पन्न की। मैंने कई तरीकों में से एक को मूल प्रश्न में संपादित किया है। PS सभी के लिए धन्यवाद उत्तर - यह मेरा पहला समय stackoverflow.com का उपयोग कर रहा है और आपके द्वारा जवाबों की मदद और गति अद्भुत है :) –

उत्तर

28

में उस पर

 
connection.set_isolation_level(0) 

अधिक जानकारी डिफ़ॉल्ट psycopg2 तक (आम तौर पर आप %s होगा स्ट्रिंग में)।

तो, यदि आप cursor.execute('... %s, %s ...', (arg1, arg2)) का उपयोग करते हैं तो उन %s क्रमशः arg1 और arg2 के मानों में बदल जाते हैं।

लेकिन जब से तुम फोन: cursor.execute(sql_function_above), अतिरिक्त तर्क के बिना, और अपने एसक्यूएल % संकेत पुस्तकालय 2 तर्क समारोह में पारित कर दिया खोजने की कोशिश कर रहा है शामिल हैं - जो सीमा से बाहर एक IndexError है, इसलिए।

समाधान: इसके बजाय % का उपयोग कर के, अपने एसक्यूएल चर में %% लिखें। PostgreSQL पर भेजे जाने से पहले इसे एक शाब्दिक % में अनुवादित किया जाता है।

1

रेंज से बाहर सूचकांक का तात्पर्य है कि आपने टुपल के तीसरे तत्व (उदाहरण के लिए) तक पहुंचने का प्रयास किया है जिसमें केवल दो तत्व हैं। ध्यान दें कि पायथन की अनुक्रमणिका 0 से शुरू होती है, इसलिए myTuple नामक दो-तत्व ट्यूपल में मेरे ट्यूपल [0] और myTuple [1] तत्व होंगे, लेकिन कोई तत्व myTuple [2] नहीं होगा। अंतिम पंक्ति के बाद

 
cursor.execute("COMMIT") 

और देखते हैं कि अगर काम करता है:

प्रयास डाल: जैसे आप लेन-देन करने से नहीं कर रहे हैं

+0

हाँ ... यही मुझे और भी भ्रमित करता है। ऐसा लगता है जैसे psycopg2 लाइब्रेरी में एक टुपल है जो कि है अपराधी और इसका मतलब यह होगा कि psycopg2 लाइब्रेरी में एक बग है (या मैं गलत निष्कर्षों पर कूद रहा हूं?)। लेकिन यदि हां, तो मेरे एसक्यूएल के बारे में इतना खास क्या है जो लाइब्रेरी को तोड़ता है जो सबसे अधिक पे ओपल पूरी तरह से स्थिर पाते हैं? यहां समस्या का एक हिस्सा यह है कि मैं यह भी अलग नहीं कर सकता कि वास्तव में चीजें गलत क्यों हो रही हैं क्योंकि जब मैं Django के बाहर SQL को निष्पादित करने का प्रयास करता हूं तो मुझे कोई त्रुटि संदेश नहीं मिलता है और फिर भी SQL निष्पादित नहीं होता है। –

+0

आपके कोड में $ 2 और% जैसे कूड़ेदान शामिल हैं। कुछ डेटाबेस पुस्तकालय पैरामीटर प्लेसहोल्डर के रूप में thoe की व्याख्या कर सकते हैं। पायथन मामले में, आप शायद लेनदेन को पूरा नहीं किया है। – nos

3

लग रहा है।

तुम भी तरह autocommit को अलगाव स्तर सेट कर सकते हैं: % प्रतीक का उपयोग तर्क प्लेसहोल्डर की पहचान करता है इस answer

+0

यद्यपि टुपल त्रुटि के लेनदेन के साथ कुछ भी नहीं था, एक बार% साइन समस्या को हटा दिए जाने के बाद, एसक्यूएल फ़ंक्शन अभी भी लोड नहीं हो रहा था और यह स्वाभाविक रूप से कारण था, इसलिए इस उत्तर के लिए भी आपको बहुत धन्यवाद :) –

+0

पीएस: आपको मैन्युअल रूप से "COMMIT" निष्पादित करने के बजाय 'connection.commit()' का उपयोग करना चाहिए - इस तरह psycopg2 वर्तमान लेनदेन स्थिति जानता है। – intgr

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