2016-06-09 8 views
1

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

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.') 
>>> 

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

ответ

1

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

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

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

+0

Хороший ответ (+1), но использование квадратных скобок будет более типичным для обычной практики Access SQL и согласуется с цитированием поля '[Component Key]' в том же запросе. –