Поле типа номера обновления pypyodbc

Я использовал приведенный ниже сценарий для успешного обновления полей в базе данных Access .mdb, которые являются текстовыми полями. Я пытаюсь обновить поле типа числа, но получаю ошибки.

import csv, pypyodbc
conn=pypyodbc.connect('Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=c:/MDBTest/MyReducedMdb.mdb;')
cursor=conn.cursor()
LUT = {}
with open("C:\MDBTest\order.txt") as file:
    for line in file:
        (key, val) = line.split()
        LUT [key] = val
print (LUT)
cursor.execute("select * from Components")
rows = cursor.fetchall()
for row in rows:
    warehousecode=row[6].strip()
    if warehousecode in LUT:
        cursor.execute("""
                        UPDATE Components
                        SET Order=?
                        Where [Component Key]=?;""", (int(LUT[warehousecode]), str(row[0])))
        cursor.commit()

Когда я запускаю код, я получаю следующие ошибки.

{'406-007': '2', '406-012': '4', '406-005': '1', '406-015': '5', '406-010': '3'}
Traceback (most recent call last):
  File "D:\My Python\Scripts\IrricadDatabaseOrderUpdate.py", line 18, in <module>
    Where [Component Key]=?;""", (int(LUT[warehousecode]), str(row[0])))
  File "C:\Python34\lib\pypyodbc.py", line 1596, in execute
    check_success(self, ret)
  File "C:\Python34\lib\pypyodbc.py", line 986, in check_success
    ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
  File "C:\Python34\lib\pypyodbc.py", line 954, in ctrl_err
    raise ProgrammingError(state,err_text)
pypyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement.')
>>>

Пожалуйста, дайте мне знать, где, по вашему мнению, может быть проблема. Спасибо.


person user3579106    schedule 09.06.2016    source источник


Ответы (1)


Ваша проблема в том, что ORDER является зарезервированным ключевым словом SQL. Заключите его в кавычки, чтобы ваш драйвер SQL не запутался.

"""
    UPDATE Components
    SET "Order"=?
    Where [Component Key]=?;"""

И дайте разработчику БД пощечину за использование ключевых слов SQL в качестве имен столбцов.

person Travis Griggs    schedule 09.06.2016
comment
Хороший ответ (+1), но использование квадратных скобок было бы более репрезентативным для обычной практики Access SQL и соответствовало заключению в кавычки поля [Component Key] в том же запросе. - person Gord Thompson; 10.06.2016