Forum: PC-Programmierung Python + SqLite: Probleme beim Insert/Update


von Mehmet K. (mkmk)


Lesenswert?

Servus allerseits

Seit einiger Zeit versuche ich mich in Python einzuarbeiten. Beim 
Zugriff auf die DB habe ich Probleme.
Ich schaffe es zwar ein Insert/Update auszuführen. Aber über den 
Lösungsweg muss ich selbst den Kopf schütteln.

Ich lese eine Zeile ein, wandle die sqlite3.row in eine Dictionary um 
und übergebe das Ganze an eine Form-Klasse.
Dort werden die Werte editiert und als Dictionary wieder zurückgegeben.
Soweit keine Probleme. Probleme habe ich beim zurückschreiben auf die 
Datenbank.

Anfaenglich hatte ich Platzhalter eingesetzt, hatte aber komische 
Ergebnisse in der Datenbank. Bis ich bemerkte, dass bei der Umwandlung 
in eine Dictionary die Reihenfolge willkürlich erfolgt und nichts mit 
der Reihenfolge der Table zu tun hat. Also mache ich es z.Zt. so:
1
cSQL = "Insert into user (valid, name, passwd) Values ("
2
cSQL = cSQL + str(d['valid']) +","
3
cSQL = cSQL + "'" + d['name'] +"',"
4
cSQL = cSQL + "'" + d['passwd'] +"'))"
5
curs.execute(cSQL)
Ich habe versucht, die Dictionary in Values und Keys aufzulösen und dann 
mit join eine Liste zu erstellen:  aber weil auch numerische Werte in 
der Dictionary vorhanden sind, gab's Fehler.

Ich hoffe, dass mir jemand einen besseren Lösungsweg zeigen kann.

MfG

von nullgeist (Gast)


Lesenswert?

Dann musst du die numerischen Werte halt in Strings umwandeln vorher?
Stringverarbeitung kann Python nun wirklich recht gut...
Wenn du genauere Probleme hast frag, ich werde den Thread etwas 
beobachten.

von Mehmet K. (mkmk)


Lesenswert?

Hab's jetzt rausgefunden (*)

Gegeben ist ein dictionary d
1
d = { 'id_nr':1111,
2
      'name': 'WerAuchImmer',
3
      'passwd': 'sagIchNicht'
4
    }
Weil's ein Insert ist, muss man die unique id-nr entfernen:
1
del d['id_nr']
1
cSQL = "insert into user ("+",".join(d.keys())+") values ("+":"+",:".join(d.keys())+")"
2
curs.execute(cSQL, d)

In cSQL steht:
1
insert into user (name,passwd) values (:name,:passwd)

Schon 'ne geile Sprache.

(*) 
http://www.python-forum.de/viewtopic.php?f=1&t=27642&hilit=sqlite+insert+dictionary

von nullgeist (Gast)


Lesenswert?

Bist du mit dem "keys" an der zweiten stelle sicher?! dann machst du 
doch nie was mit den Daten im Dictionary?
Ansonsten ist es glaube leichter lesbar wenn du die Strings mit string 
formatting (mit %, so ähnlich wie in C bei printf) einfügst statt + zu 
verwenden.

von nullgeist (Gast)


Lesenswert?

Achso, sql injection geht natürlich wenn du Strings zusammenbaust...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.