2016-09-30 16 views
3

注 - 如MaxU下面所示,此問題特定於mysql.connector,如果您使用pymysql,則不會發生此問題。希望這可以爲其他人省去一些頭疼的問題MySQL存儲過程,熊貓和「執行多個語句時使用multi = True」

使用Python,Pandas和mySQL並且無法讓存儲過程返回結果,更不用說進入數據框了。

我不斷收到關於多個查詢的錯誤,但是我運行的存儲過程是非常簡單的參數驅動查詢。

不要緊,我使用的存儲過程,它始終是相同的結果

事實上,下面(sp_test對它)的試驗方法與下面的查詢 -

select * from users; 

如果我運行與

df=pd.read_sql("select * from users", cnx,index_col=None, coerce_float=True) 

而不是

df=pd.read_sql("call sp_test()", cnx,index_col=None, coerce_float=True) 
相同的語句

它工作正常,即使sp_test對它SELECT * FROM用戶

爲什麼我不斷收到多=真錯誤信息,如何去解決這個問題,並讓我的存儲過程的結果?我不明白簡單的select語句將如何返回多個結果集。

如果還有其他方法可以做到這一點,高興地嘗試它。

以下是簡單的代碼,我使用

import pandas as pd 
from pandas.io.data import DataReader 
from pandas import DataFrame 
import mysql.connector 

cnx = mysql.connector.connect(user='jeff', password='password', database='testdatabase', host='xx.xxx.xxx.xx') 
df=pd.read_sql("call sp_test()", cnx,index_col=None, coerce_float=True) 

當我到pd.read_sql,我收到以下錯誤消息

InterfaceError       Traceback (most recent call last) 
C:\Users\User\AppData\Local\Continuum\Anaconda3\lib\site- packages\mysql\connector\cursor.py in execute(self, operation, params, multi) 
    506    try: 
--> 507     self._handle_result(self._connection.cmd_query(stmt)) 
    508    except errors.InterfaceError: 

C:\Users\User\AppData\Local\Continuum\Anaconda3\lib\site-packages\mysql\connector\connection.py in cmd_query(self, query) 
725    raise errors.InterfaceError(
--> 726     'Use cmd_query_iter for statements with multiple queries.') 
727 

InterfaceError: Use cmd_query_iter for statements with multiple queries. 

During handling of the above exception, another exception occurred: 

InterfaceError       Traceback (most recent call last) 
C:\Users\User\AppData\Local\Continuum\Anaconda3\lib\site- packages\pandas\io\sql.py in execute(self, *args, **kwargs) 
    1563    else: 
-> 1564     cur.execute(*args) 
    1565    return cur 

C:\Users\User\AppData\Local\Continuum\Anaconda3\lib\site- packages\mysql\connector\cursor.py in execute(self, operation, params, multi) 
    510      raise errors.InterfaceError(
--> 511       "Use multi=True when executing multiple statements") 
    512     raise 

InterfaceError: Use multi=True when executing multiple statements 
+0

你有沒有試過pd.read_sql_query()? –

+0

是的,同樣的錯誤 –

+1

@Jeff,嘗試'pd.read_sql(「call sp_test();」,...)'(注意分號)。除此之外,我會嘗試運行它使用不同的MySQL Python模塊,例如'pymysql'(這是用於內部熊貓測試)... – MaxU

回答

0

希望這會有所幫助。使用here中的一些概念指針,以及一些小小的試驗/錯誤,我能夠使用mysql.connectorpandas來完成這項工作。

# CONNECT TO DB AND GET CURSOR OBJECT 
conn = <do db connecty stuff> 
cur = conn.cursor() 

# CALL THE STORED PROCEDURE 
cur.callproc('stored_proc_name', ['my', 'usp', 'parameters']) 

# EXTRACT RESULTS FROM CURSOR 
for i in cur.stored_results(): results = i.fetchall() 

# LOAD INTO A DATAFRAME 
df = pd.DataFrame(results, columns=['my', 'column', 'headers']) 

這對我來說是完美的...我希望它也適合你。

相關問題