2017-08-01 3 views
0

Ein psycopg2-Cursor verwendet eine Zeichenfolge mit ausgeblendeten Teilzeichenfolgen, die text/char/varchar-Werte darstellen. Zum Beispiel wird eine gespeicherte Prozeduren zu verwenden, die in eine Tabelle einfügt:Unescaped-Zeichenfolge in Python interpolieren

cur.execute('SELECT insert_profile("name", "favorite color example")') 

Mein Problem tritt auf, wenn ich versuche, String-Interpolation zu verwenden Variable die Zeichenfolge einzufügen, die an die Ausführungsfunktion übergeben wird.

Ich habe versucht, doppelte Anführungszeichen für die Variablen und einfache Anführungszeichen im String-Literal zu verwenden, aber dies führt nur die übliche Operation aus. ZB:

name = "Harry" 
color = "Blue" 
cur.execute('SELECT insert_profile({0}, {1})'.format(name, color) 

Ich habe auch die Variablen Nest versucht, aber es fügt den wörtlichen geschachtelten String in die Datenbank:

name = "'Harry'" 
color = "'Blue'" 

Was ist der richtige Ansatz? Entschuldigung, wenn die Antwort irgendwo anders auf SO oder im Internet ist. Ich hatte keinen Erfolg, mich umzusehen.

Antwort

0

Von der psycopg Webseite:

cur.execute(
...  """INSERT INTO some_table (an_int, a_date, another_date, a_string) 
...   VALUES (%(int)s, %(date)s, %(date)s, %(str)s);""", 
...  {'int': 10, 'str': "O'Reilly", 'date': datetime.date(2005, 11, 18)}) 

Der Query-String hat Platzhalter, die Schlüssel im Wörterbuch beziehen, und der Fahrer wird die Werte mit entsprechenden Angabe, auf der Flucht usw. interpolieren, die Sie speichern kann eine ziemliche viel Ärger.

Noch wichtiger: Sie sollten nie Abfragen durch Zeichenfolgenoperationen wie Concat-Operation oder format erstellen. Dies führt zu einer großen Sicherheitslücke aufgrund der SQL-Injektion. Lass den Fahrer die harte Arbeit machen!