Я пытаюсь обновить данные с «Активно» на «Выведено из эксплуатации» по циклу через список устройств из определенного текстового файла.
Но почему-то не фильтрует список устройств из текстового файла и не обновляет соответствующие данные, вообще не внося изменений в базу.
Может ли это быть как-то связано с моим оператором 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, используя нотацию *, чтобы разбить массив идентификаторов устройств в функцию 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()
Надеюсь, это поможет кому-то.
Я не знаком с этой нотацией, используемой в odbc. хотя вы могли бы построить серию ?, на основе длины результатов ... Я обновлю, чтобы показать, что
Так что да, вы можете сделать что-то подобное... осторожно.
Я сам не пробовал, но предполагаю, что
WHERE device_id in (?, ?, ? ...)иcursor.execute(sql, results)не сработают, верно?