2016-04-14 12 views
0

So habe ich eine gespeicherte Prozedur auf einem lokalen SQL Server, das mehrere Datensätze/Tabellen gibtPandas IO SQL und gespeicherte Prozeduren mit mehreren Ergebnismengen

Normalerweise in Python/Pyodbc würde ich

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

Ich möchte die ps.io.sql.read_sql verwenden und die gespeicherte Prozedur mit mehreren Ergebnismengen in Datenrahmen zurückgeben, aber ich kann nichts finden, das darauf verweist, wie man den Cursor bewegt und mehr Informationen erhält, bevor man die Dinge schließt .

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() 

Antwort

0

sollten folgende Arbeiten:

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: manuell zu vermeiden, um die Spaltennamen angeben Ich habe den Code hier aktualisiert.

Beachten Sie, dass die ursprüngliche Frage nur einen "lokalen SQL Server" angibt, keine bestimmte Art von SQL Server. Diese Antwort funktioniert mit MySQL, aber ich habe es nicht mit einer anderen Variante getestet.

+0

Während dies funktionieren sollte, führt es eine sqlalchemy-Abhängigkeit ein und scheint auch auf einen mysql-Server zu verweisen. – Mdev

+0

'sqlalchemy' ist für den Import von Daten in Pandas in der üblichen Weise erforderlich (http://pandas.pydata.org/pandas-docs/stable/io.html#sql-queries), also nicht einfach nur mit der Datenbank verbinden Für mehrere Ergebnismengen wird es für die meisten Leute sinnvoll sein, einfach 'sqlalchemy' zu verwenden. Es sollte jedoch trivial sein, die Methodik in dieser Antwort mit einer anderen Verbindungsmethode zur Datenbank zu verwenden. Bezüglich "Referenzieren eines MySQL-Servers", siehe http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls. –

Verwandte Themen