2013-03-10 8 views
8

का उपयोग करके संग्रहीत प्रक्रिया से परिणाम वापस नहीं कर सकते हैं कुछ अजीब कारणों से मुझे पाइथन परीक्षण ऐप में कॉलप्रोक कॉल से परिणाम नहीं मिल सकते हैं। MqSQL 5.2.47 में संग्रहीत प्रक्रिया इस प्रकार है:,पाइथन कर्सर

अब अजगर 3.3 के साथ PyCharm का उपयोग कर, मैं जब इस संग्रहीत प्रक्रिया बुला कुछ भी पुनः प्राप्त नहीं कर पा रहे।

import mysql.connector 

cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') 
cnx._open_connection() 
cursor = cnx.cursor() 

cursor.execute("select * from person where person.person_id = 1") 
people = cursor.fetchall() 

for person in people: 
    print(person) 

cnx.close() 

लेकिन या तो cursor.fetchall() या cursor.fetchone() के साथ इस कोड ...

import mysql.connector 

cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') 
cnx._open_connection() 
cursor = cnx.cursor() 

cursor.callproc("getperson", [1]) 
people = cursor.fetchall() 

for person in people: 
    print(person) 

cnx.close() 

... रिटर्न "mysql.connector: इस कोड मुझे वांछित परिणाम हो जाता है। त्रुटियां। इंटरफेस त्रुटि: कोई परिणाम नहीं प्राप्त करने के लिए सेट किया गया है। " एक अतिरिक्त अजीब व्यवहार इतना तरह cursor.execute() विधि का उपयोग कर ...

import mysql.connector 

cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') 
cnx._open_connection() 
cursor = cnx.cursor() 

cursor.execute("call getperson(1)") 
people = cursor.fetchall() 

for person in people: 
    print(person) 

cnx.close() 

... नहीं है, क्योंकि यह पैदावार: के बाद "mysql.connector.errors.InterfaceError कई प्रश्नों के साथ बयानों के लिए उपयोग cmd_query_iter" "mysql.connector.errors.InterfaceError: कई कथन निष्पादित करते समय बहु = सही का उपयोग करें" इस तथ्य के बावजूद कि मैं केवल एकाधिक परिणाम सेट के बजाय एक क्वेरी परिणाम लौटा रहा हूं। क्या MySQL पायथन कनेक्टर एक डबल क्वेरी के रूप में संग्रहीत प्रक्रिया पर निष्पादन कॉल का इलाज कर रहा है? मैं सिर्फ संग्रहीत प्रक्रिया को कैसे कॉल कर सकता हूं और अपने परिणाम वापस प्राप्त कर सकता हूं? मैं वास्तव में अपने कोड में गतिशील एसक्यूएल नहीं चाहता। किसी भी सलाह के लिए आगे धन्यवाद!

उत्तर

11

आप resultsets में से एक को चुनने की कोशिश की है क्यों की कोशिश नहीं कर रहा?

for result in cursor.stored_results(): 
    people = result.fetchall() 

यह हो सकता है कि यह कई resultsets के लिए आवंटित है, भले ही आप केवल एक SELECT stmt है। मुझे PHP की MySQLi संग्रहीत प्रक्रियाओं में पता है कि यह INOUT और आउट परिवर्तनीय रिटर्न (जो फिर से, आपके पास इनमें से कोई भी नहीं है, लेकिन हो सकता है कि यह किसी भी तरह आवंटित हो)।

पूरा कोड मैं उपयोग कर रहा हूँ (जो काम कर रहा है) है:

import mysql.connector 

cnx = mysql.connector.connect(user='me',password='pw',host='localhost',database='mydb') 
cnx._open_connection() 
cursor = cnx.cursor() 

cursor.callproc("getperson",[1]) 

for result in cursor.stored_results(): 
    people=result.fetchall() 

for person in people: 
    print person 

cnx.close() 
0

इसे इस तरह

cursor.callproc("getperson", ['1']) 
+0

कि MySQL से एसक्यूएल सर्वर वाक्य रचना की अधिक नहीं होना चाहेंगे? –

+0

क्योंकि यह MySQL के पीएल/एसक्यूएल में मान्य कमांड नहीं है। यह SQL सर्वर के टी-एसक्यूएल के लिए एक वैध कमांड है, लेकिन यह इस परियोजना के लिए मैं उपयोग नहीं कर रहा हूं। संग्रहीत प्रक्रियाओं का आह्वान करने के लिए MySQL का वाक्यविन्यास 'proc proc_name ([arguments])' है। – gfish3000

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