使用一条语句将多行更新从 pandas DataFrame 应用于 SQL Server 表

问题描述 投票:0回答:1

我正在尝试使用 pandas 数据帧中的值更新 Microsoft SQL Server 表条目(使用 pypyodbc)。目前,我正在从 pandas 数据帧创建一个 numpy 数组,然后迭代数组的每一行,使用唯一的 ItemID 执行 UPDATE WHERE ItemID = ?声明。

有没有办法在单个 UPDATE 语句中完成以下操作,而不是在每个记录上循环?

import pypyodbc
import pandas as pd

data = [['tom', 10, 11], ['nick', 12, 13], ['juli', 14, 15]]

df = pd.DataFrame(data)

np_array = df.to_numpy()

query = """
        UPDATE table_A 
        SET Item1 = ?, Item2 = ? 
        WHERE ItemID = ?
        """

connection = pypyodbc.connect('<connection_string>')
cursor = connection.cursor()

for i in range(0,len(np_array)):
    itemID = np_array[i][0]
    item1 = np_array[i][1]
    item2 = np_array[i][2]

    params = (
            item1,
            item2,
            itemID,
            )
    cursor.execute(query, params)
    cursor.close

cursor.commit()
connection.close
python sql-server pandas dataframe pypyodbc
1个回答
0
投票

如果您使用的是 SQL Server 2016 或更高版本,您可以使用

OPENJSON()
,如下所示:

data = [['tom', 10, 11], ['nick', 12, 13], ['juli', 14, 15]]
# give the columns meaningful names
df = pd.DataFrame(data, columns=["ItemID", "Item1", "Item2"])

sql = """\
UPDATE table_A SET table_A.Item1 = df.Item1, table_A.Item2 = df.Item2
FROM table_A
INNER JOIN
OPENJSON(?) WITH (
    ItemID nvarchar(50) '$.ItemID',
    Item1 int '$.Item1',
    Item2 int '$.Item2'
) AS df
ON table_A.ItemID = df.ItemID
"""
cursor.execute(sql, df.to_json(orient="records"))
© www.soinside.com 2019 - 2024. All rights reserved.