【问题标题】:Updating MySQL DB Using Python For Loop Does not Work使用 Python For 循环更新 MySQL 数据库不起作用
【发布时间】:2019-07-26 05:19:51
【问题描述】:

我正在尝试通过循环通过特定文本文件中的设备列表将数据从“活动”更新为“退休”。

然而,不知何故,它不会从文本文件中过滤设备列表并更新相应的数据,根本不会对数据库进行任何更改。

这可能与我提出的 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()

【问题讨论】:

    标签: python mysql loops for-loop


    【解决方案1】:

    看起来问题出在您的 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 = ?"""
    

    【讨论】:

      【解决方案2】:

      在@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()
      
      

      希望这对某人有所帮助。

      【讨论】:

      • 我自己没有尝试过,但我假设WHERE device_id in (?, ?, ? ...)cursor.execute(sql, results) 不会正常工作?
      • 我不熟悉 odbc 中使用的表示法。您也许可以根据结果的长度构造一系列?, ...我会更新以显示这一点
      • 所以是的,你可以做这样的事情......小心点。
      猜你喜欢
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      相关资源
      最近更新 更多