【问题标题】:Pandas IO SQL and stored procedure with multiple result setsPandas IO SQL 和具有多个结果集的存储过程
【发布时间】:2016-04-14 15:04:23
【问题描述】:

所以我在本地 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()

【问题讨论】:

    标签: python sql-server pandas stored-procedures pandasql


    【解决方案1】:

    以下应该有效:

    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,但我尚未使用任何其他品种对其进行测试。

    【讨论】:

    • 虽然这应该可行,但它引入了 sqlalchemy 依赖项,并且似乎还引用了 mysql 服务器?
    • sqlalchemy 是以标准方式 (pandas.pydata.org/pandas-docs/stable/io.html#sql-queries) 将数据导入 Pandas 所必需的,因此对于大多数人来说,与其以不同的方式连接到数据库,不如为多个结果集只需使用sqlalchemy。但是,将此答案中的方法与连接到数据库的不同方法一起使用应该是微不足道的。关于“引用一个mysql服务器”,请看docs.sqlalchemy.org/en/latest/core/engines.html#database-urls
    • 你知道吗,我怎样才能使用 pandas.read_sql 函数实现相同的行为?stackoverflow.com/questions/59149457/…
    • 为了获得更好的性能,我将为每个数据集创建数据框,如下所示:df1 = pd.DataFrame(cursor.fetchall(),columns=["col_name1","col_name2"])
    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多