使用 SQL 服务器中的 Python 更新 table 中列的值

UPDATE values of a column in a table with Python in SQL Server

我想在 python 中使用 SQL 服务器查询更新列,如您所见,我正在更新相关列,如下所示: 我有一个 CSV 文件,其中包含一些相对 table 的 A 值,如下所示:

CSV 文件:(a.csv)

ART-B-C-ART0015-D-E01
ADC-B-C-ADC00112-V-E01

Python代码:(创建名称值)

ff = pd.read_csv("C:\a.csv",encoding='cp1252')
ff["Name"]= df["A"].str.extract(r'([a-zA-Z]{3}\d{4,5})') + "-A"

python 代码的结果:

ART0015-A
ADC00112-A

Table :

A                              Name                     FamilyName
ART-B-C-ART0015-D-E01          NULL                        ART
ADC-B-C-ADC00112-V-E01         NULL                      ADC00112

A 也是我的 table 中的一列(不是所有 A 记录,而是其中的一些记录)并且基于 A 值我想更新 Name 列。 我的数据库是 SQL 服务器,我不知道如何更新 SQL 服务器中的名称列,其中 csv 文件中的 A 值等于相对 table 中的 A。 Python 中的代码:

conn = pyodbc.connect('Driver={SQL Server}; Server=ipaddress; Database=dbname; UID=username; PWD= {password};')
cursor = conn.cursor()
conn.commit()
for row in ff.itertuples():
    cursor.execute('''UPDATE database.dbo.tablename SET Name where ?

)

conn.commit()

预期结果 table

A                              Name                     FamilyName
ART-B-C-ART0015-D-E01          ART0015-A                 ART
ADC-B-C-ADC00112-V-E01         ADC00112-A                ADC00112

我会使用 SQL 临时 table 和内部联接来更新值。这仅适用于更新 SQL table 中的部分记录。它还可以有效地更新许多记录。

SQL 光标

# reduce number of calls to server on inserts
cursor.fast_executemany = True

创建临时 Table

statement = "CREATE TABLE #temp_tablename(A VARCHAR(200), Name VARCHAR(200))"
cursor.execute(statement)

将值插入临时 Table

# insert only the key and the updated values
subset = ff[['A','Name']]

# form SQL insert statement
columns = ", ".join(subset.columns)
values = '('+', '.join(['?']*len(subset.columns))+')'

# insert
statement = "INSERT INTO #temp_tablename ("+columns+") VALUES "+values
insert = [tuple(x) for x in subset.values]

cursor.executemany(statement, insert)

从临时 Table

更新主要 Table 中的值
statement = '''
UPDATE
     tablename
SET
     u.Name
FROM
     tablename AS t
INNER JOIN 
     #temp_tablename AS u 
ON
     u.A=t.A;
'''

cursor.execute(statement)

临时删除Table

cursor.execute("DROP TABLE #temp_tablename")