Sqlite3 zu .csv .xlsx importieren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Will
User
Beiträge: 3
Registriert: Sonntag 28. August 2016, 16:24

Hallo Leute,

ich habe ein Problem! Ich habe mehrere Sqlite Tabellen alle aus unterschiedlichen Datenbanken welche im selben Ordner gespeichert sind. Nun möchte ich mit einer Select Anweisung die entsprechenden Spalten der unterschiedlichen Tabellen in eine .csv oder .xlsx Datei importieren. Aus dieser bspw. .csv Datei möchte ich eine neue SQLite Tabelle generieren und sie in einer neuen Datenbank abspeichern. Ich nutze dafür Python 2.7. würde mich freuen wenn mir jemand dabei einen guten Tipp geben kann wie ich dieses Problem angehen kann.

Grüße Will
BlackJack

@Will: Das klingt auf den ersten Blick erst einmal nach komischem bis falschem verwenden von SQL-Datenbanken. Kannst Du erklären was Du *eigentlich* machen möchtest, was dann zu diesem Lösungsansatz geführt hat?
Will
User
Beiträge: 3
Registriert: Sonntag 28. August 2016, 16:24

Hallo BlackJack,

ich möchte die Daten aus den Tabellen in chronologischer Reihenfolge in einer neuen Tabellen ausgeben können. Der Sinn ist, dass dadurch eine Analyse des zeitlichen Ablaufs möglich wird. Die .csv oder .xlsx Dateien sind notwendig für eine zusätzliche grafische Darstellung. Allerdings ist die grafische Darstellung kein Problem. So könnte ich mit einer neuen Datei, wie den csv Dateien gleich zwei Fliegen mit einer Klappe schlagen.
Bin aber auch für neue Lösungsansätze offen. Da ich mich in diesem Bereich nicht so gut auskenne, war das meine Idee mit der ich mein Vorgehen geplant habe. Musste mich zuerst ganz viel über Python und SQLite einlesen.


Gruß Will
BlackJack

@Will: Welches konkrete Problem hast Du denn jetzt? Für Sqlite3 gibt es in der Standardbibliothek ein Modul. Für CSV-Dateien auch. Dann braucht man vielleicht noch das `glob`-Modul, und ansonsten halt Python um ein paar Funktionen zu schreiben, die dann das machen was Du haben möchtest. Teil das Gesamtproblem in kleinere Teilprobleme auf, die dann wieder in Teilprobleme, solange bis sie so klein sind, dass man sie mit einer Funktion mit ein paar Zeilen Code lösen kann. Diese Teillösungen setzt Du dann in Funktionen zu grösseren Teillösungen zusammen, bis am Ende das Gesamtproblem gelöst ist.
Will
User
Beiträge: 3
Registriert: Sonntag 28. August 2016, 16:24

So sieht mein ganz einfacher Code aus der zunächst nur die grundlegende Funktionalität erledigen sollte.

Code: Alles auswählen

import sqlite3
import csv

values = []

sqlitePath = "C:\TestOrdner\suggestions.db"
conn = sqlite3.connect(sqlitePath)
c = conn.cursor()
###########################################################################
#Versuch ob sich die Daten mit INSERT INTO direkt in die neue Tabelle eintragen lassen#
##########################################################################
c.execute("CRATE TABLE suggestionsTest(Data1 TEXT, Data2 TEXT, Data3 TEXT, Data4 TEXT)")
#c.execute("INSERT INTO suggestionsTest SELECT activ1, activ2 , activ3, FROM suggestions")

###########################################################
Dieser Teil funktioniert garnicht. Die csv Datei wird garnicht erzeugt.
###########################################################
csvfile = "C:\TestOrdner\NewTable.csv"
with open(csvfile, "wr") as output:
    writer = csv.writer(output, lineterminator='\n')
    for row in values:
        writer.writerow([row])


with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerows(values)
Ich programmiere noch nicht lange, daher fehlt mir auch einiges an Verständnis für die Materie. Versuche halt mir selbst alles selber beizubringen.
Vielleicht steckt hier ein ganz gravierender Fehler sogar drin, welchen ich nicht sehe. Deswegen wäre ich dankbar für jede Hilfe.
BlackJack

@Will: Das ist ziemlich sicher nicht der Code den Du tatsächlich geschrieben und laufen lassen hast. Den mal davon abgesehen das Zeile 16 ganz sicher zu einem SyntaxError schon beim kompilieren, also vor der eigentlichen Ausführung, führen wird, käme das Programm auch sonst gar nicht erst bis dort hin. Denn Zeile 12 führt zu einem `sqlite.OperationalError` weil auch das SQL ist nicht syntaktisch korrekt.

Den Dateimodus 'wr' gibt es nicht. Ich vermute mal stark was da passieren kann ist undefiniert. Aber etwas später wird die Datei ja noch einmal mit dem gültigen Modus 'w' erstellt. Sofern der Programmfluss tatsächlich bis dort hin kommt, muss die Datei danach auch existieren. Wenn natürlich auch leer, denn `values` ist ja leer.

Ob die Variante mit dem falschen Dateimodus ansonsten so Sinn machen würde, käme extrem darauf an was `values` denn dann am Ende mal enthält, aber es ist eher unwahrscheinlich. Insbesondere wenn der Name `row` korrekt verwendet ist.

Arbeite am besten mal das Tutorial in der Python-Dokumentation durch um ein Gefühl für die Kontrollstrukturen von Python und die grundlegenden Datentypen zu bekommen.

Dann sollten die Namen im Programm aussagekräftig sein, also eher nicht `conn` oder `c` sondern `connection` und `cursor`, damit man das besser lesen und verstehen kann. Ausserdem werden Namen von Variablen üblicherweise klein und mit Unterstrichen geschrieben, also `sqlite_path` statt `sqlitePath`. Das steht zum Beispiel im Style Guide for Python Code.

Rückwärts gerichtete Schrägstriche haben in Zeichenkettenliteralen eine besondere Bedeutung. Das sieht man hier im Forum auch deutlich an der farbigen Syntaxhervorhebung das diese Zeichen mit dem jeweiligen Folgezeichen anders dargestellt werden als der Rest der Zeichenkette. Du hast Glück, dass keine Kombination dabei ist, die etwas anderes Bedeutet als Backslash gefolgt von dem nächsten Zeichen. Man sollte die entweder alle richtig ”escapen”, mit jeweils einem Backslash, ein ”rohes” Zeichenkettenliteral verwenden, oder normale Schrägstriche verwenden. Da kommen die Windows-APIs auch mit klar. Nur die Shell unter Windows mag das nicht, weil bei DOS der Schrägstrich für Kommandozeilen-Optionen verwendet wurde.

Wie schon gesagt: Teil das Problem in Teilprobleme auf die von Funktionen gelöst werden. Auf Modulebene gehören weder Variablen noch das Programm, da sollten nur Definitionen von Konstanten, Funktionen, und Klassen stehen. Dann kann man das Modul importieren, ohne dass das Programm ausgeführt wird, und die Funktionen einzeln Testen, manuell oder automatisiert, und auch einige andere Werkzeuge erwarten, das man Module importieren kann, ohne das etwas vom Programm ausgeführt wird (ausser den Definitionen).
Antworten