2013-03-10 2 views
8

Per qualche strano motivo non riesco a ottenere risultati da una chiamata callproc in un'app di prova Python. La stored procedure in MqSQL 5.2.47 si presenta così:Impossibile restituire i risultati dalla stored procedure utilizzando il cursore Python

Ora, usando PyCharm con Python 3.3, non riesco a recuperare nulla quando si chiama la stored procedure. Questo codice mi ottiene i risultati desiderati:

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() 

ma questo codice sia con cursor.fetchall() o 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() 

... restituisce "mysql.connector. errors.InterfaceError: nessun risultato impostato per il recupero da. " C'è un comportamento strano aggiuntivo utilizzando il metodo cursor.execute() in questo modo ...

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() 

... perché produce "mysql.connector.errors.InterfaceError: Usa cmd_query_iter per le dichiarazioni con più query", seguito da "mysql.connector.errors.InterfaceError: usa multi = True quando si eseguono più istruzioni" nonostante il fatto che sto restituendo solo un risultato di una query piuttosto che più set di risultati. Il connettore Python MySQL considera la chiamata execute sulla stored procedure come una doppia query? Come posso chiamare la stored procedure e ottenere i miei risultati? Non voglio davvero SQL dinamico nel mio codice. Grazie in anticipo per qualsiasi consiglio!

risposta

11

Hai provato scegliendo una delle di risultati?

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

Potrebbe essere che sta destinando a più gruppi di risultati, anche se si dispone di un solo SELECT stmt. So che nelle procedure memorizzate MySQLi di PHP faccio questo per consentire i ritorni variabili INOUT e OUT (che di nuovo non ne hai, ma forse lo stanno allocando comunque).

Il codice completo che sto usando (che sta lavorando) è:

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

Perché non provare in questo modo

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

Non sarebbe più della sintassi SQL server di MySQL? –

+0

Perché non è un comando valido in PL/SQL di MySQL. È un comando valido per T-SQL di SQL Server, ma non è quello che sto utilizzando per questo progetto. La sintassi di MySQL per invocare stored procedure è 'call proc_name ([argomenti])'. – gfish3000