Cx_oracle в Python, выдающий "ошибку отсутствующего выражения" - литералы даты и метки времени?
У меня есть кусок кода, который поддерживает процедуру создания записей опроса. 1 строка приводит к сбою, и я не могу понять, почему. Вот фрагмент:
data = [4, 1, 5, '2015-01-01', '2016-07-26 14:32:19']
insert_query2 = 'INSERT INTO SURVEY_RESPONSE (ID, SURVEY_ID, RESPONDENT_ID, DATE_TAKEN, DATE_ENTERED) VALUES (:sr_id , :survey_id , :respondent_id , DATE :dt , TIMESTAMP :ts )'
cursor.prepare(insert_query)
cursor.execute(None, {"sr_id":data[0], "survey_id":data[1], "respondent_id":data[2], "dt":data[3], "ts":data[4]})
Поэтому мои данные упакованы в список, а затем я пытаюсь передать каждый элемент списка в качестве параметра. Я пытался передать саму строку, как я видел в примерах, но все еще получал ошибку:
File "myfile.py", line 95, in insert_new_survey_response
cursor.execute(insert_query2, {"sr_id":data[0], "survey_id":data[1], "respondent_id":data[2], "dt":data[3], "ts":data[4]})
cx_Oracle.DatabaseError: ORA-00936: missing expression
Теперь я знаю, что строка работает, если я скопирую ее в свою СУБД и жестко закодирую передаваемые значения, она работает. Столбцы правильные и все мои типы данных правильные.
Я думаю, что именно так я пытаюсь использовать литералы DATE и TIMESTAMP. Так сказано в документации Oracle, но я не уверен, поддерживается ли она в cx_Oracle. Есть ли способ обойти нужное им? Сами поля представляют собой типы данных даты и метки времени, поэтому я подумал, что это правильно.
1 ответ
Я только что нашел ответ - литералы не подходят для использования, to_date() и to_timestamp() являются правильными методами для передачи правильного форматирования даты и метки времени.
Обсуждение здесь: Oracle - литерал не совпадает с ошибкой строки формата
Я собираюсь оставить это пока на случай, если кто-то еще столкнется с этой проблемой:)