Seite 1 von 1
pysqlite - INSERT
Verfasst: Freitag 19. August 2005, 11:23
von Sebastian_
Das funktioniert wunderbar:
Code: Alles auswählen
from pysqlite2 import dbapi2 as sqlite
con = sqlite.connect("C:\sqli")
cur = con.cursor()
cur.execute("INSERT INTO words (voc) values ('teststring')")
con.commit()
Versuche ich das allerdings mit einer Variable:
Code: Alles auswählen
test = "test"
cur.execute("INSERT INTO words (voc) values (test)")
meldet er mir, dass es die Spalte (!!) test nicht gibt.
Wo mache ich hier was falsch?
Edit (Leonidas): Code in Python-Tags gesetzt.
Verfasst: Freitag 19. August 2005, 11:58
von Clython
Code: Alles auswählen
test = "test"
cur.execute("INSERT INTO words (voc) values (%s)") % test
So sollte es eigentlich funktionieren. Du musst in einem String Platzhalter angeben (fangen % an und hören mit einem Buchstaben auf, s steht z.B. für String) und dann am Ende des Codes ein % und die passende Variable. Falls du mehrere Platzhalter hast, muss die Variablen als Tupel angeben. Reihenfolge beachten!
Verfasst: Freitag 19. August 2005, 12:32
von Leonidas
Alternativ kannst du auch die Platzhalter benennen und dann durch ein Dict füllen lassen.
Verfasst: Freitag 19. August 2005, 12:52
von Clython
Ehrlich, geht das? Kannst du mal ein kleines Beispiel posten Leonidas? Danke.
Verfasst: Freitag 19. August 2005, 14:43
von Leonidas
Sicher:
Code: Alles auswählen
namen = {'poster1' : 'Clython',
'poster2': 'Leonidas'}
print "Sowohl %(poster1)s als auch %(poster2)s schreiben ins Python-Forum." % namen
Ist sehr praktisch als kleines Templating-System.
Verfasst: Sonntag 21. August 2005, 18:15
von Damaskus
Clython hat geschrieben:Code: Alles auswählen
test = "test"
cur.execute("INSERT INTO words (voc) values (%s)") % test
So sollte es eigentlich funktionieren. Du musst in einem String Platzhalter angeben (fangen % an und hören mit einem Buchstaben auf, s steht z.B. für String) und dann am Ende des Codes ein % und die passende Variable. Falls du mehrere Platzhalter hast, muss die Variablen als Tupel angeben. Reihenfolge beachten!
Kleine Korrektur bevor sich noch jemand den Wolf sucht
Code: Alles auswählen
test = "test"
cur.execute("INSERT INTO words (voc) values (%s)" % test)
Verfasst: Montag 22. August 2005, 06:47
von jens
Damaskus hat geschrieben:Code: Alles auswählen
test = "test"
cur.execute("INSERT INTO words (voc) values (%s)" % test)
Seid ihr sicher, das es so richtig ist??? Ich denke nicht, weil Python per String-Operation das ganze zusammen fügt und somit kein SQL-Escaping der Werte vorgenommen wird.
Mit mySQLdb geht das nämlich so:
Code: Alles auswählen
test = "test"
cur.execute("INSERT INTO words (voc) values (%s)", test)
Verfasst: Freitag 26. August 2005, 06:32
von Damaskus
Damaskus hat geschrieben:Code: Alles auswählen
test = "test"
cur.execute("INSERT INTO words (voc) values (%s)" % test)
Also bei mir funktioniert es so.
Verfasst: Freitag 26. August 2005, 07:21
von jens
Damaskus hat geschrieben:Also bei mir funktioniert es so.
Natürlich funktioniert es so *auch*, aber wie ich versucht hab klar zu machen, übernimmt in dieser Variante Python das Einsetzten der Variable test in des SQL-Kommando. Es ist allerdings besser, das der DB-Schnittstelle zu überlassen, weil dann die Werte so escaped werden, das SQL-Injection wirkungslos sind.
Verfasst: Sonntag 4. September 2005, 09:28
von Leonidas
Ja, und somit kann man eine Sicherheitslücke mit 0 Aufwand loswerden. Zum formatieren von SQL Statements ist noch
diese Mail lesenswert.