2013-03-10 19 views
8

何らかの奇妙な理由により、私はPythonテストアプリケーションでcallproc呼び出しから結果を得ることができません。 MqSQL 5.2.47でストアドプロシージャは、次のようになります。Pythonの3.3とPyCharmを使用して、今すぐPythonのカーソルを使用してストアドプロシージャの結果を返すことができません

、私はこのストアドプロシージャを呼び出すときに何かを取得するように見えることはできません。 ...

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を返します。このコードは、私に望ましい結果を取得します。 errors.InterfaceError:フェッチ元に​​設定されている結果がありません。 "それが生み出すので、そうのような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:複数の文を実行するときにmulti = Trueを使用する"ということは、複数の結果セットではなく1つのクエリ結果しか返さないという事実にもかかわらずです。 MySQL Pythonコネクタはストアドプロシージャの実行呼び出しを二重クエリとして扱っていますか?ストアドプロシージャを呼び出して結果を返すことはできますか?私は本当に私のコードで動的SQLをしたくありません。アドバイスをありがとう!

答えて

11

それを試してみませんか?

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

あなたが唯一のSELECTのstmtを持っているにもかかわらず、複数の結果のために割り振るだことが考えられます。 PHPのMySQLiストアドプロシージャでINOUTとOUTの変数を返すことができるようにするには、これを行います(これには何もありませんが、とにかく割り当てているかもしれません)。

私は(働いている)使用している完全なコードは次のとおりです。

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よりもSQLサーバーの構文のよりと思いませんか? –

+0

これは、MySQLのPL/SQLで有効なコマンドではないためです。 SQL ServerのT-SQLには有効なコマンドですが、これは私がこのプロジェクトで使用しているコマンドではありません。ストアドプロシージャを呼び出すためのMySQLの構文は 'call proc_name([arguments])'です。 – gfish3000

関連する問題