Pandas IO SQL 和具有多个结果集的存储过程
Pandas IO SQL and stored procedure with multiple result sets
所以我在本地 sql 服务器上有一个存储过程,这个 returns 多个数据集/表
通常,在 python / pyodbc 中我会使用
cursor.nextset()
subset1 = cursor.fetchall()
cursor.nextset()
subset2 = cursor.fetchall()
我希望使用 ps.io.sql.read_sql 和 return 具有多个结果集的存储过程到数据帧中,但是我找不到任何关于如何移动光标并获取更多结果的内容关闭之前的信息。
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()
以下应该有效:
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)
编辑:我已经更新了这里的代码以避免必须手动指定列名。
请注意,原始问题仅指定了 "local SQL server",而不是特定种类的 SQL 服务器。这个答案适用于 MySQL,但我还没有用任何其他版本测试过它。
所以我在本地 sql 服务器上有一个存储过程,这个 returns 多个数据集/表
通常,在 python / pyodbc 中我会使用
cursor.nextset()
subset1 = cursor.fetchall()
cursor.nextset()
subset2 = cursor.fetchall()
我希望使用 ps.io.sql.read_sql 和 return 具有多个结果集的存储过程到数据帧中,但是我找不到任何关于如何移动光标并获取更多结果的内容关闭之前的信息。
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()
以下应该有效:
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)
编辑:我已经更新了这里的代码以避免必须手动指定列名。
请注意,原始问题仅指定了 "local SQL server",而不是特定种类的 SQL 服务器。这个答案适用于 MySQL,但我还没有用任何其他版本测试过它。