2016-04-14 10 views
0

所以我有一個本地的SQL服務器上的存儲過程,這將返回多個數據集/表熊貓IO SQL和多結果存儲過程將

通常情況下,在python/pyodbc我會用

cursor.nextset() 
subset1 = cursor.fetchall() 
cursor.nextset() 
subset2 = cursor.fetchall() 

我希望利用ps.io.sql.read_sql並將帶有多個結果集的存儲過程返回到數據框中,但是我找不到任何引用如何在關閉之前移動光標並獲取更多信息的內容。

import pandas as ps 

query = "execute raw.GetDetails @someParam = '118'" 
conn = myConnection() #connection,cursor 

results = ps.io.sql.read_sql(query, con=conn[0]) 

results.head() 

conn[1].close() 

回答

0

下面應該工作:

import pandas as pd 
from sqlalchemy import create_engine 

engine = create_engine('mysql://{}:{}@{}/{}'.format(username, password, server, database_name)) 
connection = engine.connect().connection 
cursor = self.connection.cursor() 

cursor.execute('call storedProcName(%s, %s, ...)', params) 

# Results set 1 
column_names = [col[0] for col in cursor.description] # Get column names from MySQL 

df1_data = [] 
for row in cursor.fetchall(): 
    df1_data.append({name: row[i] for i, name in enumerate(column_names)}) 

# Results set 2 
cursor.nextset() 
column_names = [col[0] for col in cursor.description] # Get column names from MySQL 

df2_data = [] 
for row in cursor.fetchall(): 
    df2_data.append({name: row[j] for j, name in enumerate(column_names)}) 

cursor.close() 

df1 = pd.DataFrame(df1_data) 
df2 = pd.DataFrame(df2_data) 

編輯:我在這裏更新的代碼,以避免手動指定的列名。

請注意,原始問題僅指定「本地SQL服務器」,而不是指定種類的SQL服務器。這個答案適用於MySQL,但我沒有用其他任何品種進行測試。

+0

雖然這應該工作,它引入了sqlalchemy依賴關係,似乎也引用了mysql服務器? – Mdev

+0

'sqlalchemy'是以標準方式(http://pandas.pydata.org/pandas-docs/stable/io.html#sql-queries)將數據導入到Pandas中所必需的,所以不需要以不同的方式連接到數據庫對於多個結果集,對於大多數人來說,只需使用'sqlalchemy'即可。但是,在這個答案中使用方法時使用不同的連接數據庫的方法應該是微不足道的。關於「引用mysql服務器」,請參閱http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls。 –

相關問題