PRAGMA Funktion

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

habe mit der Funktion:

Code: Alles auswählen

cursor.execute('''PRAGMA table_info(laender_info)''').fetchall()

Code: Alles auswählen

[(0, u'index', u'INTEGER', 0, None, 0),
 (1, u'land', u'TEXT', 0, None, 0),
 (2, u'kuerzel', u'TEXT', 0, None, 0),
 (3, u'hauptstadt', u'TEXT', 0, None, 0),
 (4, u'beitrittsdatum', u'INTEGER', 0, None, 0),
 (5, u'regierungschef', u'TEXT', 0, None, 0),
 (6, u'regierungspartei', u'TEXT', 0, None, 0),
 (7, u'stimmgewicht', u'INTEGER', 0, None, 0),
 (8, u'flaeche', u'INTEGER', 0, None, 0),
 (9, u'einwohner_mio', u'REAL', 0, None, 0),
 (10, u'einwohner_km2', u'INTEGER', 0, None, 0),
 (11, u'auslaender', u'REAL', 0, None, 0),
 (12, u'sprachen', u'TEXT', 0, None, 0)]
wie kann ich hieraus nun eine Liste zweier Tupel entwickeln, in der an der ersten Stelle des Tupels der Spaltenname und an der zweiten Stelle der Datentyp steht. Also im Prinzip genau die Liste wie im Output nur ohne die Zahlenwerte und 'None'.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das sind wieder absolute Basics! Du musst doch nur die gegebene Liste durchlaufen und eine *neue* erstellen, die nur noch genau die Datenbeinhaltet, die Du brauchst.

Man kann das sogar als List-Comprehension oder bei Bedarf auch als Generator-Funktion aufbauen. Das sind aber beides Themen, die man als Anfänger nicht unbedingt drauf haben muss. Den kanonischen ersten Ansatz aber auf jeden Fall ;-)

Merk Dir das Vorgehen auf jeden Fall. Denn so etwas kommt oft vor!

Edit: Der Thread-Titel passt imho gar nicht gut zum Inhalt! ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wollte gerade das gleiche schreiben, wie Hyperion. Kann ich mir ja dann sparen.

Ich würd's per List Comprehension machen. Ist pythonisch und elegant ;-)

Gruß, noisefloor
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

und wie schreibe ich dann die List-Comprehension Bedingung ?? :K
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

indem du die Doku zu List Comprehensions liest :D -> https://docs.python.org/2/tutorial/data ... rehensions

Du kannst auch einfach in einer for-Schleife über die Liste iterieren und dir dabei eine neue Liste gem. deinen Vorgaben bauen. Gleiches Ergebnis wie List Comprehension, nur wengier elegant. Was ja erst mal egal ist, wenn "nur" das Ergebnis zählt ;-)

Gruß, noisefloor
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

wie man List Comprehensions schreibt weiß ich...aber wie schreibe ich die Bedingung dass ich nur den Spaltennamen und den Datentyp ausgegeben haben möchte?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

indem du nur die Elemente mit dem gewünschten Index in die neue Liste übernimmst. Genau so, wie du es in einer for-Schleife auch machen würdest.

Gruß, noisefloor
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Es sind wirklich absolute Basics. Geh und lies das Tutorial nochmal. Dann wirst du verstehen, was hier passiert:

Code: Alles auswählen

>>> t = ('a', 'b', 'c', 'd')
>>> t
('a', 'b', 'c', 'd')
>>> t[1]
'b'
>>> t[2]
'c'
>>> t[2:]
('c', 'd')
>>> t[:2]
('a', 'b')
>>> t[1:3]
('b', 'c')
In specifications, Murphy's Law supersedes Ohm's.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

so habe es jetzt :)

Code: Alles auswählen

tab_info  = [(i[1],i[2]) for i in cursor.execute('''PRAGMA table_info(laender_info)''').fetchall()]
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Padidem: Mein Beispiel in den Zeilen 12 und 13 hast du nicht wirklich gelesen, oder?
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

Funktioniert das überhaupt so? Der Rückgabewert von `Cursor.execute()` hat eine `fetchall()`-Methode? Das steht nicht in der `sqlite3`-Dokumentation und in der DB 2.0 API steht zu der Methode wörtlich: „Return values are not defined.”.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

funktioniert einwandfrei :lol:
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@Padidem: wenn etwas funktioniert, heißt das noch nicht, dass man es auch benutzen sollte, vor allem, wenn es nirgends dokumentiert ist und es einen Standard erweitert, und es DB2.0-Implementierungen gibt, die das nicht unterstützen.
BlackJack

Zudem ist es ja nicht einmal für das `sqlite3`-Modul dokumentiert, also kann man auch nicht davon ausgehen dass das eine Erweiterung ist die öffentlich sein soll und damit auch mit jeder Version funktioniert.
Antworten