2016-07-26 3 views
0

J'ai un morceau de code qui supporte une procédure pour faire des enregistrements d'enquête. Une ligne le fait échouer et je n'arrive pas à comprendre pourquoi. Voici un extrait:Cx_oracle en Python donnant "missing expression error" - littéral de date et d'horodatage?

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]}) 

donc mes données sont empaquetés dans une liste, puis j'essaie de passer chaque élément de la liste en tant que paramètre. Je tentais de passer la ligne elle-même comme je l'ai vu dans les exemples, mais était encore en train de l'erreur:

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 

Maintenant, je sais que la ligne fonctionne, si je devais le copier dans mon SGBD et hardcode les valeurs Je passe, ça marche. Les colonnes ont raison et tous mes types de données ont raison.

Je pense que c'est la façon dont j'essaie d'utiliser les littéraux DATE et TIMESTAMP. C'est ce que l'on dit dans la documentation d'Oracle, mais je ne suis pas sûr que ce soit supporté par cx_Oracle. Y a-t-il un moyen de se déplacer a besoin d'eux? Les champs eux-mêmes sont des dates et des types de données d'horodatage donc j'ai pensé que c'était correct.

Répondre

0

Je viens de trouver la réponse - les littéraux ne sont pas bons à utiliser, to_date() et to_timestamp() sont les méthodes correctes pour passer le formatage correct de la date et de l'horodatage.

Discussion ici: Oracle - literal does not match format string error

Je vais le laisser en place pour l'instant au cas où quelqu'un court d'autre dans ce problème aussi :)

+0

Oui, ou mieux encore utiliser le type datetime Python réel (au lieu de chaînes) qui peut être passé directement et n'a pas besoin d'être converti! –