2016-07-26 17 views
0

Ich habe ein Stück Code, das ein Verfahren zur Erstellung von Umfragedatensätzen unterstützt. Eine Zeile führt dazu, dass es scheitert und ich kann nicht herausfinden warum. Hier ist ein Ausschnitt:Cx_oracle in Python geben "fehlende Ausdruck Fehler" - Datum und Zeitstempel Literale?

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

So werden meine Daten in eine Liste gepackt und dann versuche ich jedes Listenelement als Parameter zu übergeben. Ich habe versucht, die Zeile selbst passieren, wie ich in den Beispielen gesehen habe, aber immer noch den Fehler bekommen:

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 

Jetzt weiß ich, dass die Leitung funktioniert, wenn ich es in meinem DBMS kopieren waren und codieren die Werte Ich vergehe, es funktioniert. Die Spalten sind richtig und alle meine Datentypen sind richtig.

Ich denke, es ist die Art, wie ich versuche, die DATE und TIMESTAMP Literale zu verwenden. So soll es in der Oracle-Dokumentation sein, aber ich bin mir nicht sicher, ob es in cx_Oracle unterstützt wird. Gibt es einen Weg um herumzukommen brauchte sie? Die Felder selbst sind Datums- und Zeitstempel-Datentypen, also dachte ich, das war richtig.

Antwort

0

Ich habe gerade die Antwort gefunden - die Literale sind nicht gut zu verwenden, to_date() und to_timestamp() sind die richtigen Methoden, um die korrekte Formatierung des Datums und des Zeitstempels zu übergeben.

Diskussion hier: Oracle - literal does not match format string error

Ich werde es jetzt für den Fall, jemand überlassen sonst läuft in dieses Problem zu :)

+0

Ja, oder besser noch den tatsächlichen Python Datetime-Typen verwenden (anstelle von Strings), die direkt übergeben werden können und nicht konvertiert werden müssen! –