簡體   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