Мой python оператор обновления sqlite не фиксирует - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь написать несколько Python SQLite3 CRUD-операторов. Я думаю, что оператор обновления написан правильно, но, очевидно, есть проблема, которую я не вижу. Оператор выполняется, но база данных не обновляется. Операторы Insert и Read работают нормально. Я пропустил функции создания базы данных и db_insert (), поскольку они работают ...

Мой код:

    import sqlite3 as sql


    def db_read():
     try:
       conn = sql.connect(database_file)

       c = conn.cursor()

       with conn:
         c.execute("SELECT * FROM netdevices")
         result = c.fetchall()

         conn.commit()

       return result

      except:
       print("Database Read Error")
       print(traceback.format_exc())


    def db_update(record_id, ip_address, device_name, connection_type, username, password):
      try:
        conn = sql.connect(database_file)

        c = conn.cursor()

        with conn:
         sql_cmd = "UPDATE netdevices SET ip_address = @ip_address, device_name = @device_name, connection_type = @connection_type, username = @username, password = @password WHERE id=@record_id"
         sql_values = [record_id, ip_address, device_name, connection_type, username, password]
         c.execute(sql_cmd, sql_values)

         conn.commit()

         print('Database Update Successful')

      except:
       print("Database Update Error")
       print(traceback.format_exc())
      
      
      db_insert(1, '10.10.10.1', 'Gateway', 'ssh', 'cisco', 'cisco')
      db_insert(2, '10.10.10.2', 'WorkshopSwitch', 'telnet', 'cisco', 'cisco')
      print('READ: ' + str(db_read()))
      print('-------')
      db_update(2, '10.10.10.250', 'WorkshopSwitch', 'ssh', 'admin', 'P@ssw0rd1')            # Update not working???
      print('-------')
      print('READ: ' + str(db_read()))

Это дает следующий результат:

    Database Insert Successful
    Database Insert Successful
    READ: [(1, '10.10.10.1', 'Gateway', 'ssh', 'cisco', 'cisco'), (2, '10.10.10.2', 'WorkshopSwitch', 'telnet', 'cisco', 'cisco')]
    -------
    Database Update Successful
    -------
    READ: [(1, '10.10.10.1', 'Gateway', 'ssh', 'cisco', 'cisco'), (2, '10.10.10.2', 'WorkshopSwitch', 'telnet', 'cisco', 'cisco')]

Как видите, обновление не производится. Может быть, я упустил несколько SQL ошибок из-за моей очень простой попытки: except: statement?

Заранее спасибо за ваш совет.

1 Ответ

0 голосов
/ 14 июля 2020

Я случайно нашел ответ :)

Массив sql_values ​​должен быть в том же порядке, что и @variables в операторе.

У меня было id=@record_id в конце Оператор UPDATE, но указан первым в массиве.

Python сопоставляет переменные в таком порядке, как форматирование строк в старом стиле, не ищет @variable и сопоставляет с той же переменной в массиве.

Ошибка:

sql_cmd = "UPDATE netdevices SET ip_address = @ip_address, device_name = @device_name, connection_type = @connection_type, username = @username, password = @password WHERE id=@record_id"
sql_values = [record_id, ip_address, device_name, connection_type, username, password,]

Правильно:

sql_cmd = "UPDATE netdevices SET ip_address = @ip_address, device_name = @device_name, connection_type = @connection_type, username = @username, password = @password WHERE id=@record_id"
sql_values = [ip_address, device_name, connection_type, username, password, record_id]
...