使用 pyodbc 更新 SQL 服务器

Update SQL Server using pyodbc

我想用每月更新的 pyodbc 将我的数据帧保存到 SQL 服务器(我希望 SQL 数据包含每月更新的 300 个数据)。问题是每次我 运行 py 文件,它被添加而不是替换所有数据。在我使用 sqlachemy 之前,我可以使用 if_exist=replace 来完成。现在我正在使用pyodbc,我不知道该怎么做。这就是我所做的

col_names = ["month", "price", "change"]
df = pd.read_csv("sawit.csv",sep=',',quotechar='\'',encoding='utf8', names=col_names,skiprows = 1) # Replace Excel_file_name with your excel sheet name
for index,row in df.iterrows():
    cursor.execute("update dbo.sawit set month = ?, price = ?, change =? ;", (row.month, row.price, row.change))
                    
    cnxn.commit()
cursor.close()
cnxn.close()

但是我得到的结果是将日期全部替换为最后一条记录。我应该怎么办?提前谢谢你。

您的 sql sql 查询没有说明要替换的条目。既没有 select 每个条目的正确行的 where 子句,也没有主键。所以在每个循环中,所有行都被当前条目替换。最后一次这样做是对最后一个条目,因此每一行都被最后一个条目替换。

您可以添加一些 where 子句以查找要替换的正确月份。

与此等价的东西:

updatedbo.sawit set month = ?, price = ? where month = ?;", (row.month, row.price, row.month)

有一种更简单的方法来做这种事情。

import pandas as pd
import pyodbc
from fast_to_sql import fast_to_sql as fts

# Test Dataframe for insertion
df = pd.DataFrame(your_dataframe_here)

# Create a pyodbc connection
conn = pyodbc.connect(
    """
    Driver={ODBC Driver 17 for SQL Server};
    Server=localhost;
    Database=my_database;
    UID=my_user;
    PWD=my_pass;
    """
)

# If a table is created, the generated sql is returned
create_statement = fts.fast_to_sql(df, "my_great_table", conn, if_exists="replace")

# Commit upload actions and close connection
conn.commit()
conn.close()

主要功能:

fts.fast_to_sql(df, name, conn, if_exists="append", custom=None, temp=False)

这是做基本相同事情的一种略有不同的方法。

import pyodbc

engine = "mssql+pyodbc://server_name/db_name?driver=SQL Server Native Client 11.0?trusted_connection=yes"

# your dataframe is here
df.to_sql(name_of_dataframe, engine, if_exists='append', index=True, chunksize=100000)

注意:pyodbc 将在 table 中为您动态创建适当的强类型字段。