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 :wink:

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.