SQL Lite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

Könnte mir jemand bei ein paar Aufgaben zu SQL-Lite helfen?

Vielen Dank
Gruß Patrick
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Padidem: Dazu solltest Du wohl eine konkrete Frage stellen. Sonst bist Du hier im falschen Unterforum (einen Bereich "Metafragen" gibt es hier aber gar nicht, vielleicht "Offtopic")
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

wie finde ich in einer Datenbank die Namen der Tabellen und die Namen der Spalten inklusive deren Datentypen heraus? :)
BlackJack

@Padidem: Das ist in der SQLite-Dokumentation eine FAQ: https://sqlite.org/faq.html#q7
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

also müssste ich einfach .tables als Befehl eingeben?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Padidem: oder auch den zweiten Abschnitt lesen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Padidem hat geschrieben:also müssste ich einfach .tables als Befehl eingeben?
In der Kommandozeile schon.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

danke erst einmal ich werde es dann versuchen...bin eben kein Profi :)
BlackJack

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.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

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.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

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
Benutzeravatar
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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Padidem: wie viele Tabellen sind denn in Deiner Datenbank?
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

zwei Tabellen: laender_info und migrationshintergrund 2013
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

@noisefloor : sorry habe mich vertippt ...ich habe den execute-Befehl als cursor.execute durchgeführt und dennoch eine leere Liste erhalten :/
BlackJack

@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.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

danke für den Tip :) allerdings habe ich die datei laender.db entpackt und dann direkt auf C:\\ gezogen.
BlackJack

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.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

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.
BlackJack

@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.
Antworten