在SQL Server中使用Python更新表中列的值

2024-10-03 09:16:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python中的SQL server查询更新一列,正如您看到的,我正在更新相对列,如下所示: 我有一个CSV文件,其中包含一些相对表的值,如下所示:

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

表:

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

A也是表中的一列(不是所有的A记录,而是其中的一些记录),并且基于我要更新的名称列的值。 我的数据库是SQL Server,我不知道如何更新SQL Server中的“名称”列,其中csv文件中的A值等于相对表中的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()

表中的预期结果

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

Tags: 文件csv代码name名称sqlserverconn
1条回答
网友
1楼 · 发布于 2024-10-03 09:16:52

我将使用SQL临时表和内部联接来更新这些值。这只适用于更新SQL表中的记录子集。它还可以有效地更新许多记录

SQL游标

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

创建临时表

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

将值插入到临时表中

# 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)

从临时表更新主表中的值

statement = '''
UPDATE
     tablename
SET
     u.Name
FROM
     tablename AS t
INNER JOIN 
     #temp_tablename AS u 
ON
     u.A=t.A;
'''

cursor.execute(statement)

放下临时桌子

cursor.execute("DROP TABLE #temp_tablename")

相关问题 更多 >