本文介紹了將存儲(chǔ)過(guò)程SELECT結(jié)果讀入PANAS數(shù)據(jù)幀的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
已給予:
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)
但這會(huì)引發(fā)錯(cuò)誤:
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í)行該語(yǔ)句:
cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()
df = pd.DataFrame.from_records(results)
是否有辦法將這些過(guò)程結(jié)果直接發(fā)送到DataFrame?
推薦答案
改用Read_SQL_Query()。
看起來(lái)@joris(+1)已經(jīng)在問(wèn)題正下方的評(píng)論中看到了這一點(diǎn),但我沒(méi)有看到,因?yàn)樗辉诨卮鸩糠种小?/p>
使用SQLA引擎–除了SQLAlChemy之外,Pandas只支持SQLite。然后使用read_sql_query()而不是Read_SQL()。后者試圖自動(dòng)檢測(cè)您正在傳遞的是表名還是成熟的查詢,但它在使用關(guān)鍵字‘exec’時(shí)似乎做得不是很好。使用READ_SQL_QUERY()跳過(guò)自動(dòng)檢測(cè),并允許您顯式指示您正在使用查詢(還有一個(gè)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)于將存儲(chǔ)過(guò)程SELECT結(jié)果讀入PANAS數(shù)據(jù)幀的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,