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_test是select * 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)
希望这会有所帮助。使用这里的一些概念指针,以及一些尝试/错误,我能够使用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)
这对我来说非常有效……我希望它也对你有用。
| 归档时间: |
|
| 查看次数: |
2774 次 |
| 最近记录: |