Anführungzeichen in SQL command

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

wie kriege ich " Zeichen im SQL command, wenn ein value ein ' enthält ?

Code: Alles auswählen

command="""INSERT INTO Scrap_ArtistInfos (ArtistID,low,SettingID,logo,DateiOrdner,Beschreibung) VALUES (NULL,%s,%i,%s,%s,"%s");""" % (low,setting_id,logo,DateiOrdner,Beschreibung,)
ich habs mit f"INSERT ... versucht
ich habs mit "INSERT ....format(...) versucht


wenn ich das wie oben mache, bekomme ich als Ergebnis:

Code: Alles auswählen

'INSERT INTO Scrap_ArtistInfos (ArtistID,low,SettingID,logo,DateiOrdner,Beschreibung) VALUES (NULL,startrek,1,background-image: url(:/Logos/grafics/StarTrek/startrek_90x40.png),Y:\\_Label\\StarTrek,"//div[@class=\'xz1bz0-0 bNiqBh\']/p");'
der macht vor dem ' Zeichen ein \ davor. ... class=\'xz1bz0-0 bNiqBh\']/p...
Beschreibung="//div[@class='xz1bz0-0 bNiqBh']/p"

Keine Ahnung warum, wieso ;(
Welche Möglichkeiten gibts denn noch, um beides " und ' zu adden ?
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Man baut keine Values per Stringformatierung in ein SQL-Statement. Niemals. Das ist nicht nur in diesem Fall ärgerlich, das ist vor allem ein riesiges Sicherheitsproblem. Wenn du Usereingaben in SQL-Statements zulässt, steht dem Benutzer damit die Datenbank offen. Stichwort: SQL Injektion.

Erster Anlautpunkt, sollte immer die Dokumentation sein. Und wenn du dir die anschaust, findest du auch, wie man Values in sqlite3 Statements verwendet.

Code: Alles auswählen

statement = "INSERT INTO Scrap_ArtistInfos (ArtistID,low,SettingID,logo,DateiOrdner,Beschreibung) VALUES (?, ?, ?, ?, ?, ?);"
cursor.execute(statement, (None, low, setting_id, logo, datei_ordner, beschreibung))
Ich war so frei und habe gleich die falsch geschrieben Namen angepasst. Namen werden in Python klein_mit_unterstrich geschrieben. Außer Klassen (PascalCase) und Konstanten (KOMPLETT_GROSS).

Bitte verwende SQL Statements immer so. Und ein Blick in die Dokumentation ist zumindest nie hinderlich.
Benutzeravatar
__blackjack__
User
Beiträge: 14093
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde das mit den Namen auch noch auf die Namen in der Datenbank erweitern, denn SQL unterscheidet nicht zwischen Gross- und Kleinschreibung, und Datenbanken dürfen dementsprechend Namen auch normalisieren und beispielsweise `ArtistID` als `ARTISTID` oder `artistid` anzeigen. Und da ist `ARTIST_ID` oder `artist_id` leichter lesbar, weil man nicht im Kopf anfangen muss die Wortgrenze(n) zu finden.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

ich benutze QtSQL und SQLite
habs nun mit query.bindValue() hinbekommen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1254
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Genau aus solchen Gründen sind Template-Strings eingeführt worden. Der Syntax ist gleich wie bei den f-strings, aber der Unterschied ist, dass man Template-Strings zuvor interpolieren muss. Eine Funktion, die dann z.B. speziell fürs Escapen zuständig ist, übernimmt dann diese Aufgabe. Am Ende wird ein normaler str ausgegeben.

Ist noch ziemlich neu und wahrscheinlich gibt es bis jetzt noch nicht viele Bibliotheken, die das unterstützen.
Cool wäre es z.B. wenn sqlite3 eine Funktion für Template-Strings bereit stellt.

Bis jetzt würde ich aber den klassischen Weg gehen und SQL-Statement getrennt von Daten behandeln. Deswegen kann man execute 2 Argumente übergeben. Das erste Artgument ist das SQL-Statement ohne Daten und das zweite Argument sind die Daten. Das zweite Argument, also die Daten, werden automatisch Escaped. Das ist also sicher.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten