鉴于:
CREATE PROCEDURE my_procedure
@Param INT
AS
SELECT Col1, Col2
FROM Table
WHERE Col2 = @Param
我希望能够将其用作:
import pandas as pd
import pyodbc
query = 'EXEC my_procedure @Param = {0}'.format(my_param)
conn = pyodbc.connect(my_connection_string)
df = pd.read_sql(query, conn)
但这会引发错误:
ValueError: Reading a table with read_sql is not supported for a DBAPI2 connection. Use an SQLAlchemy engine or specify an sql query
SQLAlchemy 也不起作用:
import sqlalchemy
engine = sqlalchemy.create_engine(my_connection_string)
df = pd.read_sql(query, engine)
抛出:
ValueError: Could not init table 'my_procedure'
我实际上可以直接使用
pyodbc
执行语句:cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()
df = pd.DataFrame.from_records(results)
有没有办法将这些过程结果直接发送到 DataFrame?
最佳答案
使用 read_sql_query() 代替。
看起来@joris (+1) 已经在问题正下方的评论中提到了这个,但我没有看到它,因为它不在答案部分。
使用 SQLA 引擎——除了 SQLAlchemy,Pandas 只支持 SQLite。然后使用 read_sql_query() 代替 read_sql()。后者尝试自动检测您传递的是表名还是完整的查询,但它似乎与 'EXEC' 关键字效果不佳。使用 read_sql_query() 跳过自动检测并允许您明确指示您正在使用查询(还有一个 read_sql_table())。
import pandas as pd
import sqlalchemy
query = 'EXEC my_procedure @Param = {0}'.format(my_param)
engine = sqlalchemy.create_engine(my_connection_string)
df = pd.read_sql_query(query, engine)
关于sql-server - 将存储过程选择结果读入熊猫数据帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26132718/