【问题标题】:Pandas Dataframe to SQL Server熊猫数据框到 SQL Server
【发布时间】:2020-07-09 10:28:11
【问题描述】:

我有一个 API 服务,在这个服务中我将 pandas 数据帧结果写入 SQL Server。

但是当我想向表中添加新值时,我无法添加。我使用了 append 选项,因为在文档中它说它向数据框添加了新值。我没有使用替换选项,因为我不想每次都删除我的表。

我需要在保留旧值的同时将新值发送到数据库表。

我研究过除了 pandas to_sql 方法之外的任何其他方法或方式,但我只能在任何地方看到 pandas。

有人知道吗?

谢谢。

【问题讨论】:

    标签: sql-server pandas pandas-to-sql


    【解决方案1】:
    1. 您应该确保您的 pandas 数据框具有正确的结构,其中键是您的 mysql 列名,数据在列表中:

       df = pd.DataFrame({"UserId":["rrrrr"],
               "UserFavourite":["Greek Salad"],
               "MonthlyOrderFrequency":[5],
               "HighestOrderAmount":[30],
               "LastOrderAmount":[21],
               "LastOrderRating":[3],
               "AverageOrderRating":[3],
               "OrderMode":["Web"],
               "InMedicalCare":["No"]})
      
    2. 建立与您的数据库的正确连接。就我而言,我正在连接到位于 127.0.0.1 的本地数据库并“使用演示;”:

       sqlEngine = create_engine('mysql+pymysql://root:@127.0.0.1/demo', pool_recycle=3600)
      
       dbConnection = sqlEngine.connect()
      
    3. 最后,输入你的表名,我的是“UserVitals”,并尝试在try-except块中执行以处理错误:

       try:
      
           df.to_sql("UserVitals", con=sqlEngine, if_exists='append');
      
       except ValueError as vx:
      
           print(vx)
      
       except Exception as ex:   
      
           print(ex)
      
       else:
      
           print("Table %s created successfully."%tableName);   
      
       finally:
      
           dbConnection.close()
      

    【讨论】:

      【解决方案2】:

      这是一个如何做到这一点的示例...包含一些额外的代码。

      # Insert from dataframe to table in SQL Server
      import time
      import pandas as pd
      import pyodbc
      
      # create timer
      start_time = time.time()
      from sqlalchemy import create_engine
      
      
      df = pd.read_csv("C:\\your_path\\CSV1.csv")
      
      conn_str = (
          r'DRIVER={SQL Server Native Client 11.0};'
          r'SERVER=your_server_name;'
          r'DATABASE=NORTHWND;'
          r'Trusted_Connection=yes;'
      )
      cnxn = pyodbc.connect(conn_str)
      
      cursor = cnxn.cursor()
      
      for index,row in df.iterrows():
          cursor.execute('INSERT INTO dbo.Table_1([Name],[Address],[Age],[Work]) values (?,?,?,?)', 
                          row['Name'], 
                          row['Address'], 
                          row['Age'],
                          row['Work'])
          cnxn.commit()
      cursor.close()
      cnxn.close()
      
      # see total time to do insert
      print("%s seconds ---" % (time.time() - start_time))
      

      【讨论】:

        猜你喜欢
        • 2023-01-08
        • 2021-10-27
        • 1970-01-01
        • 2020-06-03
        • 2015-11-12
        • 2014-02-01
        • 1970-01-01
        相关资源
        最近更新 更多