sqlite und update - Syntaxfrage

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Oscar
User
Beiträge: 22
Registriert: Dienstag 25. September 2007, 17:57

Hi,
ich habe mir als Python-Einsteiger eine Adressdatenbank erstellt. Orientiert habe ich mich
dabei an einem Grundlagenbeitrag von Moderator Gerold.
http://www.python-forum.de/topic-11615. ... ht=adresse
Das klappt auch so weit ganz gut. Nun versuche ich vorhandene Datensätze mit update
zu modifizieren, was aber nicht funktioniert. Mein Versuch:

Code: Alles auswählen

cur.execute("UPDATE adressen set aendern = neuwert WHERE name = person")
Die Werte von "aendern", "neuwert" und "person" sollen über Benutzereingaben kommen.
Die entsprechenden Werte hole ich mir mit der raw_input() Funktion.
Ansatzweise habe ich schon verstanden, das solche Änderungen über Tupel realisiert werden
sollen, aber praktisch habe ich noch nicht kapiert, wie das syntaktisch gemacht wird ... :(
Gruß Oscar
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Oscar hat geschrieben:

Code: Alles auswählen

cur.execute("UPDATE adressen set aendern = neuwert WHERE name = person")
Die Werte von "aendern", "neuwert" und "person" sollen über Benutzereingaben kommen.
Hallo Oscar!

Willkommen im Python-Forum!

Du kannst über den von dir angesprochenen Tupel *nur* *Werte* ersetzen lassen. Den Feldnamen musst du selber ändern.

Code: Alles auswählen

feldname = "aendere_mich"
sql = "UPDATE adressen set %s = ? WHERE name = ?" % feldname
Das Ersetzen der Werte überlässt du dann wieder der SQLite-Schnittstelle.

Code: Alles auswählen

cur.execute(sql, ("neuwert", "person"))
Achte aber unbedingt darauf, dass "feldname" nicht vom Benutzer direkt eingegeben werden kann. Eine Auswahl der Feldnamen ist OK, aber dass der Benutzer einfach irgend einen Text als Feldnamen angeben kann, dass musst du verhindern. Ansonsten könnte der Benutzer eventuell in die SQL-Anweisung seine *eigene* SQL-Anweisung einschleusen. Das wird von der SQL-Schnittstelle mit dem *Tupel* in cur.execute bereits automatisch für "neuwert" und "person" verhindert. Du musst dich nur noch um "feldname" kümmern.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Oscar
User
Beiträge: 22
Registriert: Dienstag 25. September 2007, 17:57

Hallo Gerold,
schönen Dank für Deine Hinweise. Nach einer kleinen Anpassung (neuwert, person ohne
Anführungszeichen) hat es funktioniert. Dank auch für die dem Code folgenden Erläuterungen.
Darüber habe ich mir bisher noch keine Gedanken gemacht, aber ich stehe ja auch erst am Anfang.
Gruß Oscar
Antworten