python und mySQLdb Insert fehler

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Pythty
User
Beiträge: 4
Registriert: Dienstag 21. Februar 2017, 18:54

Donnerstag 25. Mai 2017, 10:34

ich möchte gerne daten aus eine textdatei in die mysql datenbank einfuegen aber ich bekomme beim Insert einer Liste die fehlermeldung, mit der ich nicht viel anfagen kann bzw. nicht schlau draus werde?

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/unixben/Development/python/scrape/domain/mysqlsave.py", line 29, in <module>
    cursor.execute("INSERT INTO tbl_domain_com (hash_url, link_url, name, stadt_ort, img_url) VALUES ('%s','%s','%s','%s','%s')" % daten)
TypeError: not enough arguments for format string

Code: Alles auswählen

daten = list()
file = open("temp_data.txt","r")
for line in file:
daten.append(line.strip().split(","))
file.close()
cursor.execute("INSERT INTO tbl_domain_com (hash_url, link_url, name, stadt_ort, img_url) VALUES ('%s','%s','%s','%s','%s')" % daten)
conn.commit()
conn.close()
Zuletzt geändert von Anonymous am Donnerstag 25. Mai 2017, 15:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Donnerstag 25. Mai 2017, 15:53

@Pythty: Also der erste Fehler ist schon mal mit dem ``%``-Operator Werte in eine SQL-Anweisung zu formatieren. Das ist *gefährlich* und heisst SQL-Injection. Du must das ``%`` durch ein ``,`` ersetzen, denn Werte werden bei `execute()` als zweites Argument übergeben und dann von der Methode *sicher* an die Datenbank übergeben. Und meistens auch effizienter als das alles als Zeichenkette zu formatieren und die Datenbank das dann wieder auseinandernehmen zu lassen. Zudem müssen die Anführungszeichen um die Platzhalter im SQL weg.

Dann enthält `daten` ja nicht *einen* Datensatz für dieses INSERT, sondern so viele Datensätze wie in der Datei vorhanden sind. Du müsstest das also entweder in einer Schleife machen, oder aber die dafür vorgesehene `executemany()`-Methode verwenden.
Antworten