mysql INSERT INTO csv Datei

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Hallo liebe Forumsmitglieder,
ich bin ein Python Frischling und habe eine Frage zum Import einer csv. Datei.
Die Verknüpfung zur Datenbank funktioniert einwandfrei, nur die Daten bekomme ich leider nicht
in meine mysql Tabelle.

Code: Alles auswählen

# Connector importieren
import sys
import mysql.connector

# csv Modul importieren
import csv

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

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

# Datensatz erzeugen
#sql = "INSERT INTO personen VALUES('Mustermann', 'Max', 10009)"
#cursor.execute(sql)


# Daten aus csv Datei einlesen
ifile  = open('test.csv', "rt")
read = csv.reader(ifile)
for row in ifile: 
    cursor.execute( "INSERT INTO personen2 (name,vorname,personalnummer)" "VALUES('%s', '%s', '%s')")
        
connection.commit()

# Execution-Objekt schliessen
cursor.close()

# Verbindung schliessen
connection.close()
Ich hoffe ihr könnt mir weiterhelfen. Vorab vielen Dank!
Zuletzt geändert von Anonymous am Dienstag 7. März 2017, 18:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@tz_wuerzburg: Man müsste `row` dann vielleicht noch beim `execute()` als zweites Argument angeben damit da auch tatsächlich Werte eingetragen werden.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: eigentlich sollte Dein INSERT fehlschlagen, weil personalnummer hoffentlich eine Zahl ist, aber ›%s‹ ist keine Zahl.

Wenn Du einen csv.reader erzeugst, solltest Du den auch benutzen. Der INSERT könnte so aussehen:

Code: Alles auswählen

with open('test.csv', "rt") as ifile:
    read = csv.reader(ifile)
    for row in read:
        cursor.execute("INSERT INTO personen2 (name,vorname,personalnummer) VALUES(%s, %s, %s)", row)
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Guten Morgen zusammen,
"personalnummer" ist erstmal ein Zahl um zu testen, ob ich überhaupt in die Datenbank schreiben kann.
Wenn das funktioniert möchte ich mich weiter heran tasten.

Code: Alles auswählen

# Connector importieren
import sys
import mysql.connector

# csv Modul importieren
import csv

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

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

# Datensatz erzeugen
#sql = "INSERT INTO personen VALUES('Mustermann', 'Max', 10009)"
#cursor.execute(sql)


# Daten aus csv Datei einlesen
with open('test.csv', "rt") as ifile:
    read = csv.reader(ifile)
    for row in read:
        cursor.execute("INSERT INTO personen2 (name,vorname,personalnummer) VALUES(%s, %s, %s)", row)
        
connection.commit()

# Execution-Objekt schliessen
cursor.close()

# Verbindung schliessen
connection.close()
Nun erhalte ich folgende Fehlermeldung:
"Not enough parameters for the SQL statement")
mysql.connector.errors.ProgrammingError: Not enough parameters for the SQL statement
Zuletzt geändert von Anonymous am Mittwoch 8. März 2017, 10:15, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@tz_wuerzburg: Da wird `row` sehr wahrscheinlich irgendwann einmal weniger als drei Elemente haben. Oder das Trennzeichen in der Datei ist kein Komma.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: die Fehlermeldung heißt so viel wie, dass INSERT 3 Parameter braucht, row aber weniger hat. Im Endeffekt bedeutet das wohl, dass Deine csv-Datei weniger als 3 Spalten hat.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Das Trennzeichen war kein Komma sondern ein Semikolon. Problem gelöst.
Gibt es denn eine einfache Möglichkeit den Import auf "TAB" oder "Semikolon" umzustellen?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

tz_wuerzburg: meinst Du ein inclusives oder ein exclusives ODER? Das ein Trennzeichen wird bei csv.reader mit delimiter angegeben.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

@Sirius3.
Vielen Dank! Damit ist mein Problem gelöst.
GajeeRedfox
User
Beiträge: 2
Registriert: Mittwoch 18. März 2020, 14:44

Hey Leute, ich habe gerade diesen Beitrag gefunden und hoffe irgendjemand liest hier noch.. ich habe ein kleines Problem das ich alleine als Python Einsteiger noch nicht lösen kann.. vielleicht findet sich ja jemand der mir dabei helfen kann. Ich versuche eine csv Datei in meine Datenbank einzulesen.. aber leider bekomme ich in der vorletzen Zeile einen Fehler mit dem ich nichts anfangen kann, im Internet habe ich mich auch schon ein bisschen dazu belesen aber dadurch werde ich nur noch mehr verwirrt.. Aber lange rede kurzer Prozess ich schicke einfach mal meinen Code hier rein plus Fehlermeldung:

import csv
import mysql.connector

verbindung = mysql.connector.connect(host="Localhost",user="root",passwd="",db="litkon")
cursor = verbindung.cursor()


#sql_tabelle = "CREATE TABLE IF NOT EXISTS kunden ("\
#"Anzahl_der_Lizenzen INT, "\
#"Aktive_Lizenzen INT, "\
#"Benutzer VARCHAR, "\
#"Lizenztyp VARCHAR, "\
#"Ablaufdatum DATETIME, "\
#"Lizenzbescheibung VARCHAR)"

#cursor.execute(sql_tabelle)


sql_befüllung ="""
INSERT INTO kunden
(Anzahl_der_Lizenzen,Aktive_Lizenzen,Benutzer,Lizenztyp,Ablaufdatum,Lizenzbeschreinung)
VALUES(%s,%s,%s,%s,%s,%s)"""

with open("C:\\Users\\benne\\Desktop\\Pythonprojekte\\CSVDateien\\Lizenzen.csv") as csvdatei:
csv_reader_object = csv.reader(csvdatei, delimiter=';')
with mysql.connector.connect(host="Localhost",user="root",passwd="",db="litkon") as verbindung:
cursor.executemany(sql_befüllung, csv_reader_object)


verbindung.commit()
verbindung.close()


Fehlermeldung:

Traceback (most recent call last):
File "D:\Codes\Fertiges Programm\1. Versuch.py", line 27, in <module>
with mysql.connector.connect(host="Localhost",user="root",passwd="",db="litkon") as verbindung:
AttributeError: __enter__


zu dem Code nochmal ganz kurz, ich habe die Tabelle in meiner Datenbank selbsterzeugt da mein Code immer mit der Syntax gemeckert hatte und ich habe keine Ahnung warum.. ich habe schon kleinere Tabellen selbst erstellt mit Python und diese auch mit Python befüllt.. aber sowas automatisiert aus einer csv Datei ist meine nächste Herrausforderung.

Ich bedanke mich schon mal im Voraus für für vielleicht geleistete Hilfe
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GajeeRedfox: Offenbar kann man das Ergebnis von `mysql.connector.connect()` nicht als Kontextmanager mit ``with`` verwenden. Die DB API V2 garantiert das auch nicht, auch wenn das bei einigen Implementierungen so geht. Also muss man da entweder mit ``try``/``finally`` arbeiten oder `contextlib.closing()` benutzen um ``with`` verwenden zu können.

Wobei da ja auch vorher schon eine Verbindung erstellt wird in dem Code die dann nicht sauber geschlossen wird.

Das `csv`-Modul liefert Zeichenketten für die Werte in den Datensätzen. Die Datenbank erwartet aber teilweise andere Datentypen. Es kann sein, dass das zufällig so funktioniert, aber sauber und robust ist es nicht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten