Python: pyodbc, Microsoft Access: обновить даты в таблице, используя квалификатор # date - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь обновить некоторые записи в базе данных Microsoft Access, используя pyodbc в Python. Я изо всех сил пытаюсь обновить поля даты / времени в Access, что потребовало бы символа # даты в выражении sql.

Примером утверждения может быть

sql = '''UPDATE [TABLE] SET[STARTDATE]=#2018-10-25# WHERE[KEYCOLUMN]=12345;'''

Используя запрос параметра, это выглядело бы как

sql = '''UPDATE [TABLE] SET[STARTDATE]=? WHERE[KEYCOLUMN]=?;'''
params = (#2018-10-25#, 12345)
cursor.execute(sql, params)

Однако выполнение завершается сбоем из-за обязательных символов # для квалификатора данных. Также использование библиотеки datetime бесполезно, так как следующие параметры также приводят к неудачному выполнению:

params = (datetime.date(2018,10,25), 12345)
cursor.execute(sql, params)

Каким будет правильный синтаксис / обходной путь для обновления полей DateTime, включая закрытие поля DateTime в базе данных Access?

Коды ошибок при попытке разных попыток (с фактическими именами таблиц и имен полей вместо имен примеров, использованных в предыдущем примере) :

При передаче даты в виде строки

SQL: UPDATE [Status Scorecard] [IN:Start Execute] = ? WHERE [IN:ID]=?;
Params: ('2015-09-14', '47977')
Error:(<class 'pyodbc.ProgrammingError'>, ProgrammingError('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. (-3503) (SQLExecDirectW)'), <traceback object at 0x07E24120>)

При передаче данных с символом # в качестве разделителя даты:

sql = '''UPDATE [Status Scorecard] [IN:Start Execute] = ? WHERE [IN:ID]=?;'''
params = (#2015-09-14#, '47977')
print(params)
r = axSCORECARD.updateSQL(sql, params)

Код не запускается, так как символ # рассматривается как комментарий, что приводит к ошибке синтаксиса кода.

При передаче данных в виде строки, используя разделитель даты # внутри строки:

SQL: UPDATE [Status Scorecard] [IN:Start Execute] = ? WHERE [IN:ID]=?;
Params: ('#2015-09-14#', '47977')
Error:(<class 'pyodbc.ProgrammingError'>, ProgrammingError('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. (-3503) (SQLExecDirectW)'), <traceback object at 0x07E24148>)

При передаче даты в виде вызова datetime.date (после добавления «import datatime» в скрипт):

SQL: UPDATE [Status Scorecard] [IN:Start Execute] = ? WHERE [IN:ID]=?;
Params: (datetime.date(2015, 9, 14), '47977')
Error:(<class 'pyodbc.ProgrammingError'>, ProgrammingError('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. (-3503) (SQLExecDirectW)'), <traceback object at 0x07E240D0>)

1 Ответ

0 голосов
/ 29 августа 2018

Разделители хеш-меток (#) требуются только для литералов даты в самом тексте команды SQL. Они не обязательны (и фактически недействительны) в параметризованном запросе.

Это работает, проверено с помощью pyodbc 4.0.24:

sql = "UPDATE [Status Scorecard] SET [IN:Start Execute] = ? WHERE [IN:ID] = ?"
params = (datetime.date(2015, 9, 14), '47977')
crsr.execute(sql, params)
cnxn.commit()

результат:

IN:ID  IN:Start Execute
-----  ----------------
47977  2015-09-14      

Чтобы "убрать" дату, используйте None

params = (None, '47977')
...