使用 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")
我想在 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")