Mit MySQLdb Tabellennamen herausfinden

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Halli Hallo,
ich weiss nicht, ob es schon zu spät für mich ist, oder ob das einfach
nicht geht. Ich versuche mit gerade an einem kleinen Script, welches mir
Datenbank Dumps erstellt. Da ich dieses gerne auch für andere Datenbanken
nutzen würde, würde ich mir gerne alle Tabellen der jeweiligen DB
angucken. Google, diverse Seiten und auch die MySQLdb Hilfe in Python
konnten nicht helfen.

Grüße prosta
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

In MySQL gibts "SHOW TABLES"... In SQLite müßte das mit "SELECT tbl_name FROM sqlite_master;" gehen...

Bei MySQL sind generell die SHOW Sachen interessant: http://dev.mysql.com/doc/refman/5.1/de/show.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Hi Jens, du hast mich auf den richtigen Weg gebracht danke!

Ein cursor.execute("Show tables") liefert in MySQLdb leider nur einen
Integer Wert zurück. Dank ein wenig Hilfe von google habe ich aber
folgendes gefunden:

Code: Alles auswählen

cursor.execute("SHOW TABLES")
tab_namen = map(lambda c: "%s" % c, cursor.fetchall())
Dies funktioniert nun und liefert mir die Namen
Gruss prosta
BlackJack

pr0stAta hat geschrieben:Ein cursor.execute("Show tables") liefert in MySQLdb leider nur einen Integer Wert zurück.
`cursor.execute()` liefert bei der DB-API 2.0 grundsätzlich eine ganze Zahl, das ist unabhängig von der verwendeten Datenbank und der Anfrage die man ausführen lässt.
Dank ein wenig Hilfe von google habe ich aber
folgendes gefunden:

Code: Alles auswählen

cursor.execute("SHOW TABLES")
tab_namen = map(lambda c: "%s" % c, cursor.fetchall())
Dies funktioniert nun und liefert mir die Namen
Wenn Du die Ergebniszeilen unbedingt in Zeichenketten umwandeln willst, dann kannst Du den ``lambda``-Ausdruck durch `str` ersetzen. Aber Du könntest auch den Tabellennamen in jeder Ergebniszeile aus dem Tupel herausholen. Das sollte dann schon eine Zeichenkette sein. Ungetestet:

Code: Alles auswählen

tab_namen = [row[0] for row in cursor]
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Hi BlackJack, danke für deinen Tipp,
finde die Lösung sogar noch ansprechender, da sie für mich leichter
nachzuvollziehen ist :)
Carsten22
User
Beiträge: 8
Registriert: Mittwoch 21. Februar 2007, 00:38

Hallo,
ich versuche das ganze gerade mit einer Microsoft Access-Datenbank.
Gibt bei mir die Meldung, dass ich nur DELETE, SELECT, INSERT und UPDATE als Argumente benutzen darf.
???

Code: Alles auswählen

import dbi 
import odbc 

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=D:\\ODBC_Test.mdb') 
mycursor = myconn.cursor() 
mycursor.execute("SHOW TABLES") 
mydata = [row[0] for row in mycursor]
print mydata[0] 
mycursor.close() 
myconn.close() 
print mydata[1] 
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Hum .. dieser Thread beschäftigt sich eigentlich mit MySQL, und nicht mit MSAccess Carsten.

SQL ist nicht überall gleich, und "SHOW TABLES" funktioniert primär nur mit dem MySQL Datenbankmanagementsystem.

MS Access Datenbanken brauchen da ein wenig mehr Aufwand, aber ich habe es gerade einmal ausprobiert.

Folgende vorbereitende Schritte sind notwendig:
  • 1.) Datenbank mit MS Access öffnen
    2.) "Extras -> Optionen -> Ansicht", dort das Kästchen "Systemobjekte" anhaken
    3.) "Extras -> Sicherheit -> Benutzer- und Gruppenberechtigungen", dort den Administrator links in der Benutzerliste und rechts bei den Objektnamen "MSysObjects" anwählen und dann den Haken bei "Daten lesen" setzen
    4.) Datenbank unter MS Access abspeichern und schließen
Unter MS Access befinden sich die Informationen zu den Tabellen unter der Systemtabelle/objekt MSysObects. Mit der Freischaltung dieser alleine kann man noch nicht darauf zugreifen, weswegen wir das Leserecht dem Administrator Account erst noch einmal zuweisen mussten.

Nun kannst du wie folgt mit Python zugreifen:

Code: Alles auswählen

import odbc

myconn = odbc.odbc("DRIVER=Microsoft Access-Treiber (*.mdb);UID=Administrator;DBQ=D:\\ODBC_Test.mdb") 
# UID muss der Administrator namentlich sein, wie er unter den Benutzerliste auch aufgelistet ist

mycursor = myconn.cursor()
mycursor .execute("SELECT Name FROM MSysObjects WHERE Type = 1;")

alle_tabellen_namen = [ tabelle[0] for tabelle in mycursor.fetchall() ]

# 'alle_tabellen_namen' enthält nun aber auch die Systemobjekt Tabellen (wie 'MSysObects')
# die man wie folgt herrausparsen könnte

tabellen_namen = [ name for name in alle_tabellen_namen if not name.startswith('MSys') ]
Gruß,
>>Masaru<<
Zuletzt geändert von Masaru am Mittwoch 21. Februar 2007, 13:51, insgesamt 1-mal geändert.
Carsten22
User
Beiträge: 8
Registriert: Mittwoch 21. Februar 2007, 00:38

Vielen Dank. Funktioniert prächtig.

Wollte nicht unbedingt einen eigenen Threat eröffnen, wiel dieses "show tables" SQL-Statement genau das wäre, was ich gebraucht habe.

P.S.Würde mich ja nicht mit Access rumärgern, aber mein Vater hat sich eine umfangreiche Geschichtsdatenbank in Access angelegt, für die ich eine GUI mit wxPython basteln will.Wenn ich das fertig habe, werde ich die Datenbank als nächstes in MySQL portieren :D .
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich würde als erstes die DB in MySQL, oder vielleicht besser in SQLite, portieren und dann eine GUI bauen ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

AFAIK kann man auch mit OpenOffice.org Base eine MySQL-Datenbank als Backend nutzen.
Antworten