【问题标题】:Update SQL Server using pyodbc使用 pyodbc 更新 SQL Server
【发布时间】:2021-02-22 04:39:29
【问题描述】:

我想使用每月更新的 pyodbc 将我的数据框保存到 SQL Server(我希望 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()

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

【问题讨论】:

  • 如果你想每次都完全替换表格的内容,那么你可以在TRUNCATE TABLE dbo.sawit后跟INSERT INTO dbo.sawit …
  • 谢谢!好主意

标签: python sql-server pandas screen-scraping pyodbc


【解决方案1】:

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

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 将在表中为您动态创建适当的强类型字段。

【讨论】:

    【解决方案2】:

    您的 sql sql 查询没有说明要替换的条目。既没有 where 子句来为每个条目选择正确的行,也没有一些主键。所以在每个循环中,所有行都被当前条目替换。最后一次完成,是最后一个条目,因此每一行都替换为最后一个条目。

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

    类似的东西:

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

    【讨论】:

    • 谢谢!我想用新数据更新所有列..
    • 我只是因为懒惰而错过了变化。你可以简单地添加它
    • 结果还是一样。全部替换为最后一条记录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多