Seite 1 von 1

mit Python csv in mysql einbinden

Verfasst: Donnerstag 8. August 2019, 08:56
von wfog3435
Hallo,
ich bin Neuling in Sachen Python und probiere gerade den Inhalt einer csv-Datei in eine Datenbank ber Python-Script zu schreiben.

die Datenbank:
CREATE TABLE mytable(
time VARCHAR(19) NOT NULL PRIMARY KEY
,msg VARCHAR(30)
,codes VARCHAR(30)
,model VARCHAR(16) NOT NULL
,id INTEGER NOT NULL
,temperature_F NUMERIC(6,3) NOT NULL
,humidity INTEGER NOT NULL
);

die csv-Datei:
time,msg,codes,model,id,temperature_F,humidity
2019-08-08 08:14:55,,,inFactory sensor,142,59.300,82
2019-08-08 08:14:56,,,inFactory sensor,142,59.300,82
2019-08-08 08:14:56,,,inFactory sensor,142,59.300,82

das Python-Script:
#!/usr/bin/python
import sys
import mysql.connector
import csv

# Verbindung zur Datenbank
try:
connection = mysql.connector.connect (host = "localhost", user = "user", passwd = "password", db = "db")
except:
print ("Keine Verbindung zum Server")
sys.exit(0)

# Execution-Objekt erzeugen
cursor = connection.cursor()


# Daten aus csv
with open('r91.csv', "rt") as ifile:
read = csv.reader(ifile)
for row in read:
cursor.execute("INSERT INTO mytable(time,msg,codes,model,id,temperature_F,humidity) VALUES(?, ?, ?, ?, ?, ?, ?)", row)

connection.commit()

# Execution-Objekt schliessen
cursor.close()

# Verbindung schliessen
connection.close()

die Fehlermeldung:
Traceback (most recent call last):
File "r91_db.py", line 21, in <module>
cursor.execute("INSERT INTO mytable(time,msg,codes,model,id,temperature_F,humidity) VALUES(?, ?, ?, ?, ?, ?, ?)", row)
File "/usr/local/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 558, in execute
"Not all parameters were used in the SQL statement")
mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement

ich hoffe mir kann jemand helfen.

Danke im Voraus.

Re: mit Python csv in mysql einbinden

Verfasst: Donnerstag 8. August 2019, 09:09
von sparrow
Bitte benutze die Code-Tags wenn du Code postest. Das ist der </> Button im vollständigen Editor.

Wie viele Elemente sind denn jeweils in "row", wenn die Zeile ausgeführt wird?

Edit: Ach halt, das ist mySql. Da sind die Platzhalter keine '?' sondern '%s', wenn ich mich richtig erinnere.

Re: mit Python csv in mysql einbinden

Verfasst: Donnerstag 8. August 2019, 11:38
von wfog3435
Hallo sparrow,

erstmal danke für die schnelle Antwort, ich habe die Platzhalter angepasst, mit dem row sollte bewirkt werden das die Kopfzeile ausgelassen wird.

jetzt bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "r91_db.py", line 21, in <module>
    cursor.execute("INSERT INTO mytable(time,msg,codes,model,id,temperature_F,humidity) VALUES(%s, %s, %s, %s, %s, %s, %s)", row)
  File "/usr/local/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 566, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 537, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 436, in _handle_result
    raise errors.get_exception(packet)
mysql.connector.errors.IntegrityError: 1062 (23000): Duplicate entry '2019-08-08 12:17:28' for key 'PRIMARY'
der Skript jetzt:

Code: Alles auswählen

#!/usr/bin/python 
import sys
import mysql.connector
import csv

# Verbindung zur Datenbank
try:
    connection = mysql.connector.connect (host = "localhost", user = "root", passwd = "blabla", db = "meine")
except:
    print ("Keine Verbindung zum Server")
    sys.exit(0)

# Execution-Objekt erzeugen
cursor = connection.cursor()


# Daten aus csv
with open('r91.csv', "rt") as ifile:
    read = csv.reader(ifile)
    for row in read:
        cursor.execute("INSERT INTO mytable(time,msg,codes,model,id,temperature_F,humidity) VALUES(%s, %s, %s, %s, %s, %s, %s)", row)
        
connection.commit()

# Execution-Objekt schliessen
cursor.close()

# Verbindung schliessen
connection.close()

Re: mit Python csv in mysql einbinden

Verfasst: Donnerstag 8. August 2019, 11:40
von wfog3435
Vielleicht gibt es ja auch einen anderen weg, ich möchte rtl_433 -R 91 die ausgelesenen Werte in MySql schreiben.

Re: mit Python csv in mysql einbinden

Verfasst: Donnerstag 8. August 2019, 11:57
von sparrow
Du hast die Spalte 'time' als Primärschlüssel angelegt und versuchst einen bereits vorhandenen Wert noch einmal hinein zu schreiben. Das funktioniert bei einem Primärschlüssel nicht - der ist ja gerade dafür da, einzigartig zu ein.

Re: mit Python csv in mysql einbinden

Verfasst: Donnerstag 8. August 2019, 12:04
von wfog3435
Danke, daran lag es, leider schmeißt mein inFactory Sender die Werte immer vierfach raus, und die Kopfzeile von der csv wird leider nicht ausgeschlossen.
Aber zumindest habe ich die Datenbank jetzt befüllt!

Re: mit Python csv in mysql einbinden

Verfasst: Donnerstag 8. August 2019, 17:50
von DasIch
Ein INSERT pro Zeile ist alles andere als effizient. In der Regel gibt es für sowas eine Methode wie `executemany`. Noch besser wäre es aber gleich LOAD DATA zu benutzen, wenn du ohnehin schon eine CSV Datei hast bietet sich dass an.

Re: mit Python csv in mysql einbinden

Verfasst: Donnerstag 8. August 2019, 19:46
von Sirius3
@wfog3435: Anmerkungen zum Code.
Das Zeitfeld sollte vom Typ TIMESTAMP sein und kein VARCHAR.
Keine nakten Excepts. Durch Deine "Fehlerbehandlung" verhinderst Du effizient, dass jemand herausfinden kann, warum keine Verbindung hergestellt werden kann. Also weg damit.
Beim Lesen der csv-Datei solltest Du den Header separat lesen, und auch testen, ob in der Datei wirklich das steht, was Du erwartest.