Tabellen aus CSV Dateien in SQLite Datenbanken importieren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

Hey Leute,
Ich bin noch blutiger Anfänger, also seid nicht zu hart zu mir :D

Ich habe mit ein paar Freunden ein kleines Programm geschrieben, welches Tabellen in CSV Dateien ausspuckt.
Das ist auch soweit alles gut so.
Nun wollen wir aber noch diese Tabellen in den CSV Dateien in eine SQLIte Datenbank importieren.
I
ch habe mir bereits das habe Internet durchsucht, aber noch eine funktionierende Lösung gefunden.
Leider verzweifeln wir gerade an dieses Aufgabe :K :K

Ich hoffe ihr könnt uns/mir dort weiterhelfen

Beste Grüße
ThoScho
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

@ThoSchoo: woran scheitert es denn? Am SQL? Habt ihr schon die Beispiele der Dokumentation angeschaut?
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

Also wir haben mal das hier ausprobiert:

Code: Alles auswählen

import csv
import sqlite3


con = sqlite3.connect("LGORT")
cur = con.cursor()
cur.execute("CREATE TABLE invoice (col1 INTEGER, col2 TEXT, col3 INTEGER);")

with open('tbl_LGORT.csv') as fin:
        dr = csv.DictReader(fin)
        to_db = [(i["col1"], i["col2"], i["col3"]) for i in dr]

cur.executemany("Insert into invoice (col1, col2, col3 Values (?, ?, ?);", to_db)
con.commit()
Es wird uns allerdings immer wider dieser Fehler ausgespuckt:

Code: Alles auswählen

cursor.execute('INSERT INTO  prices VALUES (?,?,?)', [t])
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied.
hier haben wir uns nun aber auch auf eine der CSV Dateien beschränket, also auch nichts allgemein verwendbares geschrieben.
Zuletzt geändert von Hyperion am Freitag 8. Januar 2016, 15:13, insgesamt 1-mal geändert.
Grund: Code in Python Code Tags gesetzt.
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

@ThoSchoo: beim gezeigten Code fehlt eine Klammer. Und die Fehlerzeile gibt es darin nicht. Sonst funktioniert bei mir alles einwandfrei.
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

@Sirius3 Wo fehlt dort eine Klammer ?
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@ThoSchoo: Das kannst du leicht selber herausfinden:

Gehe von links nach rechts alle Zeichen durch. Beginne bei n=0 zu zählen. Für jede öffnende Klammer addiere 1 zu n. Für jede schließende Klammer subtrahiere 1 von n. Sobald n < 0 wird, gibt es eine schließende Klammer zuviel. Wenn am Ende n > 0 ist, gibt es n schließende Klammern zuwenig.

Dieser Algorithmus zeigt einem zwar nicht, wo genau ein Klammerungsfehler ist, aber man kann ihn auch auf Teilausdrücke anwenden, von denen man vermutet, dass dort der Fehler liegen könnte. In deinem Fall zB. bei dem Teilausdruck (col1, col2, col3...
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

In Zeile 13 hinter ``col3`` ;-)

An eurer Namenswahl solltet ihr aber dringend arbeiten! ``fin``, ``dr```und ganz schlimm ``i`` sind keine guten Namen; sie sagen entweder nichts sinnvolles aus oder sind als Abkürzungen wenig sinnvoll... versucht den Objekten deskriptive Namen zu geben. Statt ``fin`` geht evtl. noch so, aber ``input_file`` tut als Name ja nicht weh. Wenn man den Inhalt aufgrund der Domäne genauer kennt, könnte man den auch im Namen verwursten. Statt ``dr`` reicht doch eigentlich ``reader`` - genau das verbirgt sich dahinter; auch hier gilt, dass man ggf. mittels des Inhalts einen noch besseren Namen finden könnte. Aufgrund des Tabellennamens könnte ich mir ``invoices`` vorstellen. Statt ``i`` dann ``invoice`` oder wenigstens neutral ``row``.

Auch im SQL-Teil sind die Namen... naja... schlecht, ``col1`` usw. Sinnvoller wären Namen, die aussagen, *was* in der jeweiligen Spalte inhaltlich gespeichert wird.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

Viele Dank für de Tipps !!

Hab es nun auch soweit alles um gesetzt:

Code: Alles auswählen

import csv
import sqlite3


con = sqlite3.connect("LGORT")
cur = con.cursor()
cur.execute("CREATE TABLE ivoice (Lgort_id INTEGER, City TEXT, Werks_id INTEGER);")

with open('tbl_LGORT.csv') as input_file:
        reader = csv.DictReader(input_file)
        to_db = [(i["Lgort_id"], i["City"], i["Werks_id"]) for i in reader]

cur.executemany("Insert into invoice (Lgort_id, City, Werks_id) Values (?, ?, ?);", to_db)
con.commit()
Doch nun gibt er mir diesen Fehler aus:

to_db = [(i["Lgort_id"], i["City"], i["Werks_id"]) for i in reader]
KeyError: 'Lgort_id'

:K :K
Zuletzt geändert von Anonymous am Freitag 8. Januar 2016, 17:30, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@ThoSchoo: Und was steht da in der CSV-Datei?
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Schau mal genau hin:
ThoSchoo hat geschrieben:

Code: Alles auswählen

... CREATE TABLE ivoice ...
... Insert into invoice ...
In specifications, Murphy's Law supersedes Ohm's.
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

@BlackJack

Hier mal ein Beispiel des Inhaltes:

LGORT_ID;City;WERKS_ID
1;Nuernberg;1
2;Nuernberg;1
3;Nuernberg;1
4;Nuernberg;1
5;Nuernberg;1
6;Nuernberg;2
7;Nuernberg;2
8;Nuernberg;2
9;Nuernberg;2
10;Nuernberg;2
11;Nuernberg;3
12;Nuernberg;3
13;Nuernberg;3
14;Nuernberg;3
15;Nuernberg;3
16;Nuernberg;4
17;Nuernberg;4
18;Nuernberg;4
BlackJack

@ThoSchoo:

Code: Alles auswählen

In [2]: 'LGORT_ID' == 'Lgort_id'
Out[2]: False
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

@BlackJack
:( versteh irgendwie nicht ganz was du mir damit sagen möchtest
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

ThoSchoo hat geschrieben:@BlackJack
:( versteh irgendwie nicht ganz was du mir damit sagen möchtest
Vermutlich das hier:

Code: Alles auswählen

In [1]: data = {'LGORT_ID': 123}

In [2]: data['LGORT_ID']
Out[2]: 123

In [3]: data['Lgort_id']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-3-900b157b19d7> in <module>()
----> 1 data['Lgort_id']

KeyError: 'Lgort_id'
In specifications, Murphy's Law supersedes Ohm's.
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

Sorry bin leider echt blutiger Anfänger :|
versteh es trotzdem nicht
BlackJack

@ThoSchoo: Ich wüsste nicht wie man das noch einfacher demonstrieren könnte warum das nicht funktioniert. Du versuchst im Programm auf einen Schlüssel zuzugreifen den es in dem Wörterbuch nicht gibt (→ `KeyError`) weil die Schreibweise in der CSV-Datei eine andere ist und `dict` nun mal auf Gleichheit testet wenn man über einen Schlüssel zugreift.
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

@ThoSchoo: und was hatten wir gerade über unsinnige Abkürzungen? Liebe-Grüße-Orte scheint was romantisches zu sein, dafür eine ID zu vergeben eher weniger :D .
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

@BlackJack
Ahh nun check ich es .. Sorry für das Brett vor meinem Kopf :D
Aber wie kann ich dieses Problem umgehen bzw. es lösen ?
Üpsilon
User
Beiträge: 225
Registriert: Samstag 15. September 2012, 19:23

Na indem du den Spaltennamen richtig schreibst :wink: also LGORT_ID statt Lgort_Id
PS: Die angebotene Summe ist beachtlich.
ThoSchoo
User
Beiträge: 20
Registriert: Freitag 8. Januar 2016, 12:54

@Üpsilon

das ändert leider nichts ... der Fehler bleibt der selbe
Antworten