Hallo allerseits!
ich bin alles andere als ein erfahrener Datenbank-Programmierer, muss mich allerdings derzeit mit folgender Aufgabenstellung befassen:
Ich soll aus einer PostgreSQL-DB (PostgreSQL 9.5) bestimmte, fuer eine Anwendung wichtige Metadaten extrahieren. Konkret geht es um die von Benutzern angelegten Tabellen (deren Namen, Namen der Tabellenspalten sowie deren Datentypen) und um eventuell von Anwendern definierte und in ihren Tabellen benutzte Datentypen. Ich habe schon intensiv gegoogelt und immerhin einen Anfang geschafft.
- Mittels
SELECT table_name FROM information_schema.tables
WHERE table_schema='public'
AND table_type='BASE TABLE';
erhalte ich die fuer mich interessanten Tabellen.
- So ermittle ich zu einer Tabelle () die enthaltenen Spalten sowie Informationen zu deren Datentypen:
SELECT column_name, data_type, udt_name
FROM information_schema.columns
WHERE table_schema='public' AND table_name='<tablename>';
- Und auch, wie ich an custom datatypes reankomme, weiss ich schon (vorausgesetzt, ich kenne den Namen eines solchen Datentyps bereits (); etwa wenn er fuer ein Attribut einer zuvor analysierten Tabelle verwendet wurde):
SELECT attname, format_type(atttypid, atttypmod)
FROM pg_type
JOIN pg_class on pg_class.oid = pg_type.typrelid
JOIN pg_attribute on pg_attribute.attrelid = pg_class.oid
WHERE typname = '<typename>'
ORDER BY attnum;
Nun allerdings stecke ich fest. Wie wir oben in 2. sehen, kann ich zu einer Tabellenspalte den “data_type” und auch, sofern es sich um einen “USER-DEFINED” type handelt, den Namen dieses custom datatypes ermitteln. Wie ermittle ich die gleiche Information zu den Attributen eines custom datatypes?
Ich habe inzwischen rausbekommen, dass in PostgreSQL die erzeugten Tabellen auch implizit als Datentypen abgelegt sind. Also eigentlich muesste ich gar nicht zwischen Tabellen und custom datatypes unterscheiden und koennte stattdessen einfach alle user-defined custom datatypes auswerten. Im Prinzip muesste man nach meinem Verstaendnis eine Query definieren, mit der ich die betreffende Untermenge der Eintraege in dem Katalog pg_type erhalte.
Ausserdem muesste ich noch irgendwie ein paar zusaetzliche Informationen ermitteln:
- Ist ein Typ ein enum-Type?
- Bei custom datatypes: die Attribute und ihre Typen und zu denen die Information, ob es sich um arrays von Werten des jew. Typs handelt.
- Ein custom datatype kann ja selbst wieder Attribute enthalten, deren Typen custom datatypes sind. Diese Eigenschaft muss ich also ebenfalls erkennen koennen.
- Weiterhin sollte es moeglich sein, Datentypen, die numerische Werte speichern (also integer sowie die Fliesskommatypen) von anderen Typen, die Text, Datumsinformationen etc. speichern, zu unterscheiden.
Die Kommunikation mit der Datenbank implementiere ich in einem C+±Programm unter Linux (RHEL 6.x), welches die Qt-Bibliothek (Version 5.9.1) und die darin bereitgestellte Funktionalitaet zum Zugriff auf Datenbanken (QSqlDatabase, QSqlQuery, …) benutzt.
Waere toll, wenn ich ein paar sachdienliche Hinweise bekommen koennte.