【问题标题】:UPDATE values of a column in a table with Python in SQL Server在 SQL Server 中使用 Python 更新表中列的值
【发布时间】:2021-03-23 14:53:15
【问题描述】:

我想用 Python 中的 SQL 服务器查询更新一列,如您所见,我正在更新相关列,如下所示: 我有一个 CSV 文件,其中包含一些相对表的 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

表:

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

A 也是我表中的一列(不是所有的 A 记录,而是其中一些),并且基于 A 值,我想更新 Name 列。 我的数据库是 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

【问题讨论】:

  • 我有一个列中有 A 值的 CSV 文件 这个文件是否可用于 MySQL 服务器访问?显示完整表格的 CREATE TABLE、表格(3-5 行)和 CSV 文件(2-3 行)的一些数据样本,以及所需的结果(更新后的表格内容)。还要指定精确的 MySQL 版本。
  • 我更新了我的内容。但请注意,我没有创建表格。我有一个表,我必须更新一个特定的列。
  • 请注意,我没有创建表。但是这个表是存在的,所以它有一个可以提供的结构。
  • 我也分享了表格结构/
  • 附言。显示代码中的表名是database.dbo.tablename,它与 SQL Server (MS SQL) 方言匹配,而不是 MySQL。请仔细查看您处理的数据库服务器。

标签: python sql-server python-3.x pandas python-2.7


【解决方案1】:

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

【讨论】:

  • 亲爱的杰森。谢谢。没有任何方法可以只使用 UPDATE database.dbo.tablename 查询而不创建临时表吗?
  • 你可以,但我认为它需要在 Python 循环中创建语法,因为需要 SQL 案例语句。我认为这也是最有效的方法。
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2015-10-29
相关资源
最近更新 更多