pysqlite - INSERT

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sebastian_

Freitag 19. August 2005, 11:23

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.
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Freitag 19. August 2005, 11:58

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!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 19. August 2005, 12:32

Alternativ kannst du auch die Platzhalter benennen und dann durch ein Dict füllen lassen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Freitag 19. August 2005, 12:52

Ehrlich, geht das? Kannst du mal ein kleines Beispiel posten Leonidas? Danke.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 19. August 2005, 14:43

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Damaskus
Administrator
Beiträge: 919
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Sonntag 21. August 2005, 18:15

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)
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 22. August 2005, 06:47

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)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Damaskus
Administrator
Beiträge: 919
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Freitag 26. August 2005, 06:32

Damaskus hat geschrieben:

Code: Alles auswählen

test = "test"
cur.execute("INSERT INTO words (voc) values (%s)" % test)
Also bei mir funktioniert es so.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 26. August 2005, 07:21

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 4. September 2005, 09:28

Ja, und somit kann man eine Sicherheitslücke mit 0 Aufwand loswerden. Zum formatieren von SQL Statements ist noch diese Mail lesenswert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten