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: 4193
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: 13100
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

ich benutze QtSQL und SQLite
habs nun mit query.bindValue() hinbekommen.
Antworten