本文介紹了將存儲過程SELECT結果讀入PANAS數據幀的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
已給予:
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)
這篇關于將存儲過程SELECT結果讀入PANAS數據幀的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,