本文介紹了將存儲過程SELECT結(jié)果讀入PANAS數(shù)據(jù)幀的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
已給予:
CREATE PROCEDURE my_procedure
@Param INT
AS
SELECT Col1, Col2
FROM Table
WHERE Col2 = @Param
我希望能夠?qū)⑵溆米鳎?/p>
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)
但這會引發(fā)錯誤:
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'
我實(shí)際上可以直接使用pyodbc
執(zhí)行該語句:
cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()
df = pd.DataFrame.from_records(results)
是否有辦法將這些過程結(jié)果直接發(fā)送到DataFrame?
推薦答案
改用Read_SQL_Query()。
看起來@joris(+1)已經(jīng)在問題正下方的評論中看到了這一點(diǎn),但我沒有看到,因?yàn)樗辉诨卮鸩糠种小?/p>
使用SQLA引擎–除了SQLAlChemy之外,Pandas只支持SQLite。然后使用read_sql_query()而不是Read_SQL()。后者試圖自動檢測您正在傳遞的是表名還是成熟的查詢,但它在使用關(guān)鍵字‘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)
這篇關(guān)于將存儲過程SELECT結(jié)果讀入PANAS數(shù)據(jù)幀的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,