Seite 1 von 1

Mit MySQLdb Tabellennamen herausfinden

Verfasst: Donnerstag 7. Dezember 2006, 16:31
von pr0stAta
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

Verfasst: Donnerstag 7. Dezember 2006, 16:35
von jens
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

Verfasst: Donnerstag 7. Dezember 2006, 16:52
von pr0stAta
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

Verfasst: Donnerstag 7. Dezember 2006, 17:11
von 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]

Verfasst: Donnerstag 7. Dezember 2006, 17:20
von pr0stAta
Hi BlackJack, danke für deinen Tipp,
finde die Lösung sogar noch ansprechender, da sie für mich leichter
nachzuvollziehen ist :)

Verfasst: Mittwoch 21. Februar 2007, 00:48
von Carsten22
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] 

Verfasst: Mittwoch 21. Februar 2007, 10:21
von Masaru
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<<

Verfasst: Mittwoch 21. Februar 2007, 13:19
von Carsten22
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 .

Verfasst: Mittwoch 21. Februar 2007, 14:03
von jens
Ich würde als erstes die DB in MySQL, oder vielleicht besser in SQLite, portieren und dann eine GUI bauen ;)

Verfasst: Donnerstag 22. Februar 2007, 11:54
von Y0Gi
AFAIK kann man auch mit OpenOffice.org Base eine MySQL-Datenbank als Backend nutzen.