python – MySQL存储过程,Pandas和“执行多个语句时使用multi = True”

注意 – 正如下面提到的MaxU,问题是mysql.connector特有的,如果使用pyMysqL则不会发生.希望这可以为别人带来一些麻烦

使用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 *

为什么我一直收到multi = true错误消息,如何解决问题并获取存储过程的结果?我不明白一个简单的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

解决方法:

希望这会有所帮助.使用here中的一些概念指针和一点试验/错误,我能够使用MysqL.connector和pandas完成这项工作.

# 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'])

这对我来说非常有用……我希望它也适合你.

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...