1

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

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

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

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

有人对此有任何想法吗?

谢谢。

4

2 回答 2

2
  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()
    
于 2020-07-23T15:25:13.033 回答
0

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

# 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))
于 2020-08-02T14:28:52.433 回答