繁体   English   中英

使用Python For循环更新MySQL数据库不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM