[英]Updating MySQL DB Using Python For Loop Does not Work
我试图通过循环通过特定文本文件中的设备列表将数据从“活动”更新为“退役”。
然而,不知何故,它不会从文本文件中过滤设备列表并更新相应的数据,根本不会对数据库进行任何更改。
它可能与我的for语句或我提出的mysql语句有关吗? 无论我修复MYSQL多少次,它仍然会产生相同的结果。
可能是什么问题呢?
请查看下面的代码,看看我是否有任何关于MYSQL或Python方面的错误。
提前感谢您的大力帮助。 非常感激。
import pyodbc
conn = pyodbc.connect('Driver={SQL Server};'
'Server=############;'
'Database=########;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
cursor.execute('SELECT id, device_id, model_number, serial_number_1,\
status_1, user_name_1 FROM [Footprint].[fpscdb001_cmdb_004].[desktop]')
results = []
with open('H:\list.txt') as inputfile:
results = inputfile.read().splitlines()
SQL = """UPDATE [Footprint].[fpscdb001_cmdb_004].[desktop]
SET status_1 = "Retired"
WHERE device_id == %s"""
try:
for i in results:
cursor.execute(SQL, results[i])
cursor.commit()
# print(rowcount)
except:
conn.rollback()
finally:
conn.close()
看起来问题是你的SQL和你的Python。
您的SQL在此部分存在问题: WHERE device_id == %s
。 在SQL中,没有==
。 相反,您使用单个=
来设置和检查值。 你应该使用WHERE device_id = ?
。
此外,您在查询中使用%s
作为占位符。 我不熟悉pyodbc,但快速检查文档看起来你应该使用?
作为占位符。
试试这个:
SQL = """UPDATE [Footprint].[fpscdb001_cmdb_004].[desktop]
SET status_1 = "Retired"
WHERE device_id = ?"""
在@RToyo写的答案的基础上,你可以更快地做到这一点
我们可以建立一个“?”列表 SQL中的占位符,然后将每个项安全地传递给ODBC持有者,使用*表示法将设备ID的数组分解为ODBC execute()
函数。 这允许您既可以执行一个查询,也可以安全地执行
import pyodbc
conn = pyodbc.connect('Driver={SQL Server};'
'Server=############;'
'Database=########;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
cursor.execute('SELECT id, device_id, model_number, serial_number_1,\
status_1, user_name_1 FROM [Footprint].[fpscdb001_cmdb_004].[desktop]')
results = []
with open('H:\list.txt') as inputfile:
results = inputfile.read().splitlines()
SQL = """UPDATE [Footprint].[fpscdb001_cmdb_004].[desktop]
SET status_1 = "Retired"
WHERE device_id in ({})""".format(("?, " * len(results))[0:-2])
try:
if len(results) > 0:
cursor.execute(SQL, *results)
except:
conn.rollback()
finally:
conn.close()
希望这有助于某人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.