2016-05-04 21 views
0

Ich weiß, dass Varianten dieses Themas an anderer Stelle diskutiert wurden, aber keiner der anderen Threads hilfreich waren.Ersetzen Sie einen doppelten Backslash mit einem einzelnen Backslash in einer Zeichenfolge in Python

Ich möchte eine Zeichenfolge von Python zu SQL übergeben. Es kann jedoch vorkommen, dass Apostrophe (') in der Zeichenfolge auftreten. Ich möchte ihnen mit einem Backslash entkommen.

sql = "update tf_data set authors=\'"+(', '.join(authors).replace("\'","\\\'"))+"\' where tf_data_id="+str(tf_data_id)+";" 

Dies wird jedoch immer \\' in meinem String geben. Daher wird der umgekehrte Schrägstrich selbst maskiert und die SQL-Anweisung funktioniert nicht.

Kann mir jemand helfen oder mir eine Alternative geben, wie ich das mache? Danke

+0

die rohe Zeichenkette gesendet werden soll liefern –

+0

auf SQL Haben Sie eine vorbereitete Anweisung betrachtet verwenden? – mba12

+1

Sie können Platzhalter verwenden und müssen überhaupt nicht entkommen. Als Bonus würden Sie sich nicht für SQL-Injection öffnen, wenn und wenn die Entweichen etwas übersieht. –

Antwort

6

Einfach nicht.
Auch keine SQL-Abfragen verketten, da diese anfällig für SQL-Injektionen sind.

Verwenden Sie stattdessen eine parametrisierte Abfrage:

sql = "update tf_data set authors=%(authors)s where tf_data_id=%(data_id)s" 
# or :authors and :data_id, I get confused with all those sql dialects out there 


authors = ', '.join(authors) 
data_id = str(tf_data_id) 

# db or whatever your db instance is called 
db.execute(sql, {'authors': authors, 'data_id': data_id}) 
+0

Danke, das ist sehr nah an dem, was ich brauche. Ich erhalte nur die folgende Fehlermeldung: ValueError: nicht unterstütztes Format Zeichen ';' (0x3b) bei Index 66 – MaxS

+0

@MaxS hast du den letzten 's' in der Zeichenfolge vertippt? Entferne auch das '' 'vollständig, da es nicht benötigt wird. – Duncan

+0

@MaxS Ja, das sollte ohne ';' schlussendlich. Ich werde es aus meiner Antwort löschen. – DeepSpace

0

Wie bereits erwähnt, verwenden Sie, wenn Sie ein Python-Paket zum Ausführen von SQL verwenden, die bereitgestellten Methoden mit Parameterplatzhaltern (falls verfügbar).

Meine Antwort behebt die genannten Probleme. Verwenden Sie ein String-Literal mit dem Präfix r

print(r"""the\quick\fox\\\jumped\'""") 

Ausgang:

the\quick\fox\\\jumped\' 
+0

Wenn ich meine Zeichenkette ausdrucken würde, würde sie mir genau geben, was ich wollte. Allerdings werde ich es zu einer anderen Zeichenfolge hinzufügen und es an SQL übergeben. Drucken funktioniert in diesem Zusammenhang nicht – MaxS

+0

print r "" "der \ quick \ fox \\\ sprang \" "" "+ r" "" \ addition \\\ "" "" AUSGABEN: der \ quick \ fox \\ \ spring \ '\ addition \\\ " –

+0

Auch Sie haben nie angegeben, was die" Hand es zu SQL "-Teil ist. Verwenden Sie ein MySQL-Paket? Direkt auf der Kommandozeile ausführen? Ihre genaue Eingabe und die beabsichtigte Ausgabe werden in Ihrer Frage nicht deutlich gemacht, so dass es für Sie äußerst schwierig ist, Ihre Frage zu beantworten. –

2

Sie verwenden Strings in doppelten Anführungszeichen, aber immer noch die einfachen Anführungszeichen in ihnen zu entkommen. Das ist nicht erforderlich, Sie müssen nur den umgekehrten Schrägstrich entfernen, den Sie in der Ersetzungsoperation verwenden möchten.

>>> my_string = "'Hello there,' I said." 
>>> print(my_string) 
'Hello there,' I said. 
>>> print(my_string.replace("'", "\\'")) 
\'Hello there,\' I said. 

Beachten Sie, dass ich drucken verwende. Wenn Sie Python nur bitten, Ihnen die Darstellung der Zeichenfolge nach der Ersetzungsoperation anzuzeigen, werden doppelte Backslashes angezeigt, da sie maskiert werden müssen.

>>> my_string.replace("'", "\\'") 
"\\'Hello there,\\' I said." 
+0

erzeugt das Problem mit dem Druck ist, dass die SQL-Anweisung nicht gedruckt wird, daher SQL wird den doppelten Backslash sowie – MaxS

+0

Nein wird es nicht. Die Zeichenfolge enthält keine zwei umgekehrten Schrägstriche. '\\ 'ist eine Zeichenkette mit genau einem Backslash. – Matthias

+0

Haben Sie versucht, bevor Sie sagen, was SQL tut? :) (oh, Matthias war schneller) – Ilja