2016-07-26 13 views
0

У меня есть кусок кода, который поддерживает процедуру создания записей опроса. 1 приводит к сбою, и я не могу понять, почему. Вот отрывок:Cx_oracle в Python, дающий «отсутствующую ошибку выражения» - литералы даты и времени?

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. Есть ли способ обойти их? Сами поля - это даты и типы данных timestamp, поэтому я думал, что это правильно.

ответ

0

Я только что нашел ответ - литералы не подходят для использования, to_date() и to_timestamp() - правильные методы для передачи правильного форматирования даты и метки времени.

Обсуждение здесь: Oracle - literal does not match format string error

Я собираюсь оставить его на данный момент в случае, если кто-то работает с этой проблемой тоже :)

+0

Да, а еще лучше использовать фактический Python тип DATETIME (вместо строки), которые могут передаваться напрямую и не нуждаются в конвертации! –