Könnte mir jemand bei ein paar Aufgaben zu SQL-Lite helfen?
Vielen Dank
Gruß Patrick
SQL Lite
@Padidem: Das ist in der SQLite-Dokumentation eine FAQ: https://sqlite.org/faq.html#q7
Wobei diese Tabelle die Spaltennamen und Typen nur in Form eines ``CREATE …``-SQL-Ausrucks enthält, man sich das da also heraus parsen müsste.
Hallo!
also ich komme irgendwie nicht weiter. Ich arbeite ja mit IPython Spyder und habe folgende Codes ausgeführt:
> import sqlite3
> c = sqlite3.connect('laender.db')
> cursor = c.cursor()
wenn ich nun den nachfogenden Code ausführe:
> c.execute('''SELECT * FROM sqlite_master WHERE type == "table"''').fetchall()
bekomme ich eine leere Liste [] ausgegeben.
also ich komme irgendwie nicht weiter. Ich arbeite ja mit IPython Spyder und habe folgende Codes ausgeführt:
> import sqlite3
> c = sqlite3.connect('laender.db')
> cursor = c.cursor()
wenn ich nun den nachfogenden Code ausführe:
> c.execute('''SELECT * FROM sqlite_master WHERE type == "table"''').fetchall()
bekomme ich eine leere Liste [] ausgegeben.
hier die konkrete Aufgabenstellung:
Stellen Sie eine Verbindung zur Datenbank (laender.db) her. Produzieren sie jeweils eine Liste mit den
Namen der Tabellen und den Namen der Spalten in den Tabellen, inklusive deren Datentypen. Erklären
sie kurz die Datentypen und deren Äquivalente in Python. Hinweis: In der SQLite Mastertabelle finden
sie die entsprechenden Daten
Stellen Sie eine Verbindung zur Datenbank (laender.db) her. Produzieren sie jeweils eine Liste mit den
Namen der Tabellen und den Namen der Spalten in den Tabellen, inklusive deren Datentypen. Erklären
sie kurz die Datentypen und deren Äquivalente in Python. Hinweis: In der SQLite Mastertabelle finden
sie die entsprechenden Daten
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
das die Liste leer ist, ist für deinen Code korrekt - du führst das execute als Methode der connection aus, und nicht des cursors... Letzteres sollte dann ein Ergebnis produzieren
Gruß, noisefloor
das die Liste leer ist, ist für deinen Code korrekt - du führst das execute als Methode der connection aus, und nicht des cursors... Letzteres sollte dann ein Ergebnis produzieren
Gruß, noisefloor
@Padidem: Erst einmal hast Du wahrscheinlich Glück das SQLite so grosszügig mit SQL umgeht, denn der Vergleichsoperator in SQL ist eigentlich nicht ``==``.
Wenn Du bei der Abfrage keine Ergebnisse bekommst, dann sind in der Datenbank schlicht keine Tabellen enthalten. Also in *der* Datenbank. Wahrscheinlich liegt die Datenbank nicht im Arbeitsverzeichnis und Du hast mit dem `connect()`-Aufruf eine neue ``laender.db`` erstellt, die natürlich leer ist.
Wenn Du bei der Abfrage keine Ergebnisse bekommst, dann sind in der Datenbank schlicht keine Tabellen enthalten. Also in *der* Datenbank. Wahrscheinlich liegt die Datenbank nicht im Arbeitsverzeichnis und Du hast mit dem `connect()`-Aufruf eine neue ``laender.db`` erstellt, die natürlich leer ist.
Tja und das Arbeitsverzeichnis von Deinem Programm oder der interaktiven Sitzung wird dann sehr wahrscheinlich nicht direkt das Wurzelverzeichnis des Laufwerks C: sein. Das wäre auch irgendwie komisch.
super ... vielen Dank...habe es jetzt endlich hinbekommen und habe folgenden Output:
[(u'table',
u'laender_info',
u'laender_info',
2,
u'CREATE TABLE laender_info (\n [index] INTEGER,\n [land] TEXT,\n [kuerzel] TEXT,\n [hauptstadt] TEXT,\n [beitrittsdatum] INTEGER,\n [regierungschef] TEXT,\n [regierungspartei] TEXT,\n [stimmgewicht] INTEGER,\n [flaeche] INTEGER,\n [einwohner_mio] REAL,\n [einwohner_km2] INTEGER,\n [auslaender] REAL,\n [sprachen] TEXT\n )'),
(u'table',
u'migrationshintergrund_2013',
u'migrationshintergrund_2013',
5,
u'CREATE TABLE migrationshintergrund_2013 (\n [index] INTEGER,\n [land] TEXT,\n [insgesamt] INTEGER,\n [ohne_mh] INTEGER,\n [mit_mh] INTEGER\n )')]
und wie kann ich nun hieraus folgendermaßen Listen erstellen :
Nur die Namen der Tabelle sollen als Liste formatiert werden. Die Namen der Spalten und deren Datentypen sollen als eine Liste von Zweier-Tupeln formatiert sein, die an erster Stelle den Namen der Spalte und an zweiter Stelle den Datentyp beinhalten.
[(u'table',
u'laender_info',
u'laender_info',
2,
u'CREATE TABLE laender_info (\n [index] INTEGER,\n [land] TEXT,\n [kuerzel] TEXT,\n [hauptstadt] TEXT,\n [beitrittsdatum] INTEGER,\n [regierungschef] TEXT,\n [regierungspartei] TEXT,\n [stimmgewicht] INTEGER,\n [flaeche] INTEGER,\n [einwohner_mio] REAL,\n [einwohner_km2] INTEGER,\n [auslaender] REAL,\n [sprachen] TEXT\n )'),
(u'table',
u'migrationshintergrund_2013',
u'migrationshintergrund_2013',
5,
u'CREATE TABLE migrationshintergrund_2013 (\n [index] INTEGER,\n [land] TEXT,\n [insgesamt] INTEGER,\n [ohne_mh] INTEGER,\n [mit_mh] INTEGER\n )')]
und wie kann ich nun hieraus folgendermaßen Listen erstellen :
Nur die Namen der Tabelle sollen als Liste formatiert werden. Die Namen der Spalten und deren Datentypen sollen als eine Liste von Zweier-Tupeln formatiert sein, die an erster Stelle den Namen der Spalte und an zweiter Stelle den Datentyp beinhalten.
@Padidem: Als erstes würde ich die Abfrage so schreiben das nur die relevanten Daten geliefert wird und nicht immer die kompletten Datensätze. Und dann musst Du wie schon gesagt das SQL parsen mit dem die Tabellen erstellt wurden das ja in der SQLite-Master-Tabelle hinterlegt ist. Da ist die Frage ob die Lösung jetzt genau mit dieser speziellen DB funktionieren muss, oder grundsätzlich mit jeder DB. Da dort wirklich die SQL-Anweisung gespeichert ist mit der die Tabelle erstellt wurde, muss man da streng genommen alles verarbeiten können was SQLite an ``CREATE TABLE…``-Syntax akzeptiert. Das konkrete Beispiel nutzt ja nur einen sehr kleinen Bruchteil davon. Nicht einmal Primärschlüssel sind ausgezeichnet.