2013-03-10 22 views
8

kullanılarak saklı yordamdan sonuç döndürülemiyor Bazı garip nedenlerden dolayı, bir Python test uygulamasında bir callproc çağrısından sonuç alamıyorum. MqSQL 5.2.47 saklanan yordam şuna benzer:Python imleci

Şimdi, Python 3.3 ile pycharm kullanarak, bu saklı yordam çağrılırken şey almak için görünmüyor olabilir.

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

Ama her iki cursor.fetchall() veya cursor.execute() ile bu kod ...

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

... döner "mysql.connector: Bu kod bana istenen sonuçları alır. errors.InterfaceError: Hiçbir sonuç alınamadı. " o verir çünkü şöyle cursor.execute() yöntemini kullanarak ek bir garip davranışları ...

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

... var: takip "mysql.connector.errors.InterfaceError birden sorgu ile tablolar için kullanın cmd_query_iter" "mysql.connector.errors.InterfaceError: Birden çok deyimi çalıştırırken multi = True kullan", birden çok sonuç kümesi yerine yalnızca bir sorgu sonucu döndürdüğüm gerçeğine rağmen. MySQL Python bağlayıcısı saklı yordamdaki yürütme çağrısını çift sorgu olarak mı ele alıyor? Depolanmış prosedürü nasıl çağırıp sonuçlarımı geri alabilirim? Kodumda gerçekten dinamik SQL istemiyorum. Herhangi bir tavsiye için şimdiden teşekkür ederiz!

cevap

11

Eğer resultsets birini seçmek denediniz bu şekilde denemiyorsunuz?

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

Size sadece bir SELECT stmt olsa bile birden çok resultsets için tahsis ediyor olması olabilir. PHP'nin MySQLi'de saklı yordamlarını biliyorum, bunu INOUT ve OUT değişken dönüşlerine izin vermek için yapın (ki yine de hiçbiriniz yoktur, fakat belki de her durumda ayrılıyor).

I (çalışıyor) kullanıyorum tam kodu:

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

Neden

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

o MySQL daha SQL server sözdizimi daha olmaz mı? –

+0

Bu, MySQL'in PL/SQL dosyasında geçerli bir komut olmadığı için. SQL Server'ın T-SQL'i için geçerli bir komuttur, ancak bu proje için kullandığım şey bu değil. MySQL'in saklı yordamları çağırmak için sözdizimi 'proc_name ([argümanlar])' dır. – gfish3000

İlgili konular