我正在尝试使用 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
如果您使用的是 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"))