2016-04-14 3 views
0

Так у меня есть хранимая процедура на локальном сервере SQL, это возвращает несколько наборов данных/таблицПанда IO SQL и хранимые процедуры с несколькими наборами результатов

Обычно в Python/pyodbc Я хотел бы использовать

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

Я хочу использовать ps.io.sql.read_sql и вернуть хранимую процедуру с несколькими наборами результатов в dataframes, однако я не могу найти ничего, что ссылается на то, как перемещать курсор и получать дополнительную информацию, прежде чем закрывать все ,

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) 

Edit: Я обновил код здесь, чтобы избежать необходимости вручную указать имена столбцов.

Обратите внимание, что в исходном вопросе указывается только «локальный SQL-сервер», а не определенный тип SQL-сервера. Этот ответ работает с MySQL, но я не тестировал его ни с каким другим разнообразием.

+0

В то время как это должно работать, оно вводит зависимость sqlalchemy и, похоже, ссылается на сервер mysql? – Mdev

+0

'sqlalchemy' требуется для импорта данных в Pandas стандартным образом (http://pandas.pydata.org/pandas-docs/stable/io.html#sql -queries), поэтому вместо того, чтобы просто подключаться к базе данных просто для множества наборов результатов, для большинства людей будет иметь смысл просто использовать 'sqlalchemy'. Однако в этом ответе должно быть тривиально использовать методологию с другим методом подключения к базе данных. Что касается «ссылки на сервер mysql», см. Http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls. –