Python cx_Oracle-Update
In meinem Python-code, wenn ich Fragen den Benutzer bei der Eingabe eine Zeichenfolge zu WÄHLEN, es funktioniert, aber wenn ich versuche das UPDATE mit der gleichen Eingabe nicht erlauben, mich zu führen
Hier ist mein code, nachdem die Verbindung erfolgreich getan
curs = connection.cursor()
str_input1 = str(input("Input : "))
str_input2 = str(input("Input : "))
statement = "UPDATE table SET variable1 = "+str_input1+" WHERE name = "+str_input2
curs.execute(statement)
connection.commit
In der Theorie der folgende code sollte funktionieren und aktualisieren Sie die variable, aber stattdessen bekomme ich die Fehlermeldung, in Zeile Köter.execute(Aussage) sagt,
cx_Oracle.DatabaseError: ORA-00904: John: invalid identifier
John war der str_input2 für die where-Klausel
Vielleicht ist das format, das gab mir einen Fehler, aber ich bin mir auch nicht sicher.
Kann jemand darauf hinweisen, was war das problem mit meinem code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Fehler ist, weil Sie nicht unter Angabe der Werte. Sie würde bekommen, die genau die gleichen Fehler von einer
SELECT
- Anweisung.Diese Aussagen Suche nach Zeilen, in denen die
name
Spalte mit dem string entspricht, derJohn
:Diese Aussagen Suche nach Zeilen, in denen die
name
Spalten entspricht derJohn
Spalte—und wenn es keineJohn
Spalte, das ist ein Fehler:So, Sie könnte dieses Problem beheben, indem Sie einfach setzen Sie Anführungszeichen um die Werte.
Aber Sie wirklich, wirklich, wirklich nicht. Diese öffnet Sie bis zu SQL-injection-Angriffe, und dumme bugs wo man nicht zitieren oder spezielle escape-Zeichen richtig, und performance-Probleme, wo die Datenbank-engine kann nicht sagen, dass Sie die gleiche Abfrage über und über, und so weiter.
Was Sie tun möchten, ist die Verwendung SQL-Parameter, anstatt zu versuchen, formatieren Sie die Zeichenfolge. Ich erinnere mich nicht, die parameter Stil cx_Oracle verwendet, aber Sie können nur
import cx_Oracle; print(cx_Oracle.paramstyle)
, und schauen Sie sich in der Tabelle zu finden. Und dann tun Sie etwas wie:Auch, ein paar Randnotizen:
connection.commit
nicht tun; du bist nur verweisen auf diecommit
- Methode nicht aufgerufen wird. Sie müssen Klammern:connection.commit()
str(input())
ist sinnlos. Dieinput
Funktion gibt immer einen string, es gibt also keinen Grund zu nennenstr
auf Sie. (Es sei denn, du bist mit Python 2.x, in welchem Fall Sie sollten mitraw_input()
, die eine Zeichenfolge zurückgibt, anstattinput
zueval
die string—öffnung die gleichen Arten von Sicherheits-Probleme wie die SQL-injection-Angriff oben—nur um Sie zu konvertieren zurück zu einem string.)