【问题标题】:Does pandas support reading data from multiple tables into a dataframe?pandas 是否支持将多个表中的数据读取到数据框中?
【发布时间】:2020-03-27 16:30:39
【问题描述】:

我正在使用 pandas 将 SQLl 输出读入数据帧。我正在调用一个返回表输出的存储过程。以下代码工作正常。如果我的存储过程返回多个表输出 [1],我如何从数据框中读取这些。我想将不同的表格输出写入不同的excel表格

query='exec [aa].[dbo].[sp_cc]?,?'
        df = pd.read_sql(query, cnxn, params=[start,end)

        writer = pd.ExcelWriter('output.xlsx')
        df.to_excel(writer, index=False, sheet_name='customers')
        writer.save()

[1]

CREATE procedure [dbo].[usp_vvvv] (....)
  BEGIN
  SET NOCOUNT ON
    .....
    select  *
    FROM #_temp_client_details
    select *
    FROM #_temp_address_details
    select *
    FROM #_temp_invoice_details

    drop table #_temp_client_details
    drop table #_temp_address_details
    drop table #_temp_invoice_details
    ....
    END TRY
    BEGIN CATCH
    ..
     END CATCH
    END

【问题讨论】:

    标签: python sql sql-server pandas pyodbc


    【解决方案1】:

    为什么你需要 Pandas 来做这件事?您可以通过多种不同方式直接从 SQL Server 转到 Excel。这是一个适合您的概念。给这只猫剥皮的方法有很多...

    Sub ADOExcelSQLServer()
         ' Carl SQL Server Connection
         '
         ' FOR THIS CODE TO WORK
         ' In VBE you need to go Tools References and check Microsoft Active X Data Objects 2.x library
         '
    
        Dim Cn As ADODB.Connection
        Dim Server_Name As String
        Dim Database_Name As String
        Dim User_ID As String
        Dim Password As String
        Dim SQLStr As String
        Dim rs As ADODB.Recordset
        Set rs = New ADODB.Recordset
    
        Server_Name = "your_server_name" ' Enter your server name here
        Database_Name = "NORTHWND" ' Enter your database name here
        User_ID = "" ' enter your user ID here
        Password = "" ' Enter your password here
        SQLStr = "SELECT * FROM [Customers]" ' Enter your SQL here
    
        Set Cn = New ADODB.Connection
        Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
        ";Uid=" & User_ID & ";Pwd=" & Password & ";"
    
        rs.Open SQLStr, Cn, adOpenStatic
         ' Dump to spreadsheet
        For iCols = 0 To rs.Fields.Count - 1
            Worksheets("Sheet1").Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
        Next
        With Worksheets("sheet1").Range("a2:z500") ' Enter your sheet name and range here
            '.ClearContents
            .CopyFromRecordset rs
        End With
         '            Tidy up
        rs.Close
        Set rs = Nothing
        Cn.Close
        Set Cn = Nothing
    End Sub
    

    【讨论】:

      【解决方案2】:

      希望对你有帮助:

      import pandas as pd
      import pyodbc
      
      conn = pyodbc.connect('driver={SQL Server};server=xxx.xxx.x.xxx;uid=myuser;pwd=mypass;database=mybd;autocommit=True')
      cursor = conn.cursor()
      cursor.execute('exec usp_with_2_select')
      
      writer = pd.ExcelWriter('pandas_simple.xlsx', engine='xlsxwriter')
      
      column_names = [col[0] for col in cursor.description]
      
      df1_data = []
      for row in cursor.fetchall():
          df1_data.append({name: row[i] for i, name in enumerate(column_names)})
      
      df1 = pd.DataFrame(df1_data)
      print(df1)
      df1.to_excel(writer,'sheet1')
      
      # this for pass the next result
      cursor.nextset ()
      
      df2_data = []
      for row in cursor.fetchall():
          df2_data.append({name: row[i] for i, name in enumerate(column_names)})
      
      df2 = pd.DataFrame(df2_data)
      print(df2)
      df2.to_excel(writer,'sheet2')
      
      writer.save()
      

      【讨论】:

      • 我可以使用 pd.read_sql() 实现相同的行为吗?不带光标。我使用 read_sql,因为它很容易一次获取所有列名。所以我可以轻松地将输出转储到 Excel 表中
      • 我正在尝试使用 read_sql..但我的问题是 cursor.nextset ()
      • 所以你是说read_sql,不支持多数据集?
      • 它正在工作..Mybad,我正在调用不同的存储过程
      • +1,但您确实应该在调用.nextset 后重新加载column_names,因为第二个结果集可能有不同的列名。
      猜你喜欢
      • 2018-10-31
      • 2011-11-10
      • 1970-01-01
      • 2022-06-13
      • 2020-11-06
      • 2020-09-06
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多