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.
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! –