MySQL 存储过程、Pandas 和“执行多条语句时使用 multi=True”

Stu*_*nce 6 python mysql stored-procedures pandas

注意 - 正如下面建议的 MaxU,该问题特定于 mysql.connector,如果您使用 pymysql,则不会发生。希望这可以为其他人省去一些麻烦

使用 Python、Pandas 和 mySQL 根本无法获得返回结果的存储过程,更不用说进入数据框了。

我不断收到关于多个查询的错误,但我运行的存储过程是非常简单的参数驱动查询。

我使用什么存储过程并不重要,它总是相同的结果

其实下面的测试程序(sp_test)就是下面的查询——

select * from users;
Run Code Online (Sandbox Code Playgroud)

如果我运行相同的语句

df=pd.read_sql("select * from users", cnx,index_col=None, coerce_float=True)
Run Code Online (Sandbox Code Playgroud)

代替

df=pd.read_sql("call sp_test()", cnx,index_col=None, coerce_float=True)
Run Code Online (Sandbox Code Playgroud)

它工作正常,即使sp_testselect * from users

为什么我不断收到 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)
Run Code Online (Sandbox Code Playgroud)

当我到达 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
Run Code Online (Sandbox Code Playgroud)

S3D*_*DEV 2

希望这会有所帮助。使用这里的一些概念指针,以及一些尝试/错误,我能够使用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'])
Run Code Online (Sandbox Code Playgroud)

这对我来说非常有效……我希望它也对你有用。