@Vondor: Da läuft so einiges falsch. Das ist alles viel zu umständlich ausgedrückt. Insbesondere die Schleife, die sich eine Liste der Schlüssel holt, um dann Indizes zu generieren, wo in der Schleife dann in *jedem* Schleifendurchlauf aufs neue sowohl eine Liste mit allen Schlüssel, als auch allen Werten erzeugt wird, um dann jeweils nur *ein* Element daraus zu nehmen, und die Listen wieder zu verwerfen. Argh!
Dann ist diese Art durch wiederholtes ``+`` Zeichenketten aufzubauen äusserst ineffizient. Dafür gibt es die `join()`-Methode auf Zeichenketten. Dann braucht man auch das letzte ', ' nicht wieder zu entfernen. Was übrigens auch auf die falsche Weise passiert. Das ist nur zufällig in diesem Fall kein Problem, aber die `strip()`-Methode entfernt keine Zeichenketten, sondern eine Menge von einzelnen Zeichen. Und zwar so oft/lange irgendeines aus dieser Menge vorkommt.
Last but not least willst Du die Werte nicht selbst in die SQL-Abfrage hineinformatieren. Insbesondere wenn die Daten aus dem Netz kommen, denn da könnte ja irgend ein Spassvogel "gemeines" reinstecken, was in einer SQL-Injection in Deinem Programm endet. Ich hoffe die Schlüssel aus Deinem Dictionary kommen nicht von aussen, denn die wären auch ein Einfallstor. Gleiches gilt für den Tabellennamen.
Wo kommt eigentlich `c` her?
Und das `str()`/`unicode()`-Geraffel sieht auch ziemlich falsch aus. Wenn das immer funktioniert, dann ist es komplett überflüssig. Der `str()`-Aufruf sowieso, denn bei `encode()` kommt schon etwas vom Typ `str` heraus.
Die Methode sollte eher so aussehen (ungetestet):
Code: Alles auswählen
def save_data(self, cursor, table, values):
sql = ('INSERT INTO %s (%s) VALUES (%s);'
% (table,
', '.join(values.iterkeys()),
', '.join(['?'] * len(values))))
cursor.execute(sql, values.values())
Setzt voraus, dass alles soweit vorbereitet ist, dass das Datenbankmodul weiss, was mit Unicode zu tun ist, das `table` und `values.keys()` nicht für SQL-Injections anfällig sind, und eventuell muss man das '?' als Platzhalter noch an die verwendete Datenbank anpassen.
Wobei auch in dieser Form immer noch die Frage bleibt warum das in einer Methode steckt, denn eigentlich ist es eine einfache Funktion.