In diesem Artikel soll ein Python-Skript vorstellen werden, welches die komplette Metastruktur einer Base ausgibt. Dies ist z. B. dann hilfreich, wenn man im Community-Forum eine Frage zu einer Base hat und man die Struktur der eigenen Base ohne Screenshots einfach und schnell beschreiben will.
Die Metastruktur einer Base #
Die Metastruktur einer Base beschreibt die Tabellen, Spalten und Ansichten einer Base. Die tatsächlichen Einträge sind in der Metastruktur nicht enthalten. Die folgende JSON-Struktur beschreibt eine vergleichsweise simple Base mit nur einer Tabelle, zwei Spalten und einer Ansicht.
{ "metadata": { "tables": [ { "_id": "0000", "name": "Table1", "columns": [ { "key": "0000", "name": "Name", "type": "text", "width": 200, "editable": true, "resizable": true }, { "key": "BydO", "type": "date", "name": "Date", "editable": true, "width": 200, "resizable": true, "draggable": true, "data": { "format": "YYYY-MM-DD" }, "permission_type": "", "permitted_users": [] } ], "views": [ { "_id": "0000", "name": "Default View", "type": "table", "is_locked": false, "rows": [], "formula_rows": {}, "summaries": [], "filters": [], "sorts": [], "hidden_columns": [], "groupbys": [], "groups": [] } ] } ], "version": 482, "format_version": 7, "settings": { "securities": { "table_settings": { "can_copy": false, "can_export": false, "can_print": false }, "share_user_settings": { "can_copy": false, "can_export": false, "can_print": false } } } } }
Dies ist natürlich unpraktisch, wenn man Hilfe im Community-Forum haben will, deshalb soll die Sturktur dieser Tabelle auf die folgenden Zeilen reduziert werden.
--- COMPLETE BASE STRUCTURE WITH ALL BASES AND COLUMNS --- Table: Table1 (ID: 0000) --> Name (text)
Wie das genau funktioniert, erfahren Sie in diesem Artikel.
Der Python-Code zum Auslesen der Metastruktur #
In SeaTable genügen nur wenige Zeilen Python-Code, um die Metastruktur einer Base zu bekommen. Konkret reichen wenige Zeilen für die Authentifizierung und eine Zeile für die Metastruktur.
from seatable_api import Base, context base = Base(context.api_token, context.server_url) base.auth() metadata = base.get_metadata() print(metadata)
Das Ergebnis bzw. die Ausgabe der Metastruktur ist jedoch alles andere als anwenderfreundlich.
{'tables': [{'_id': '0000', 'name': 'Table1', 'columns': [{'key': '0000', 'name': 'Name', 'type': 'text', 'width': 200, 'editable': True, 'resizable': True}], 'views': [{'_id': '0000', 'name': 'Default View', 'type': 'table', 'is_locked': False, 'rows': [], 'formula_rows': {}, 'summaries': [], 'filter_conjunction': 'And', 'filters': [], 'sorts': [], 'hidden_columns': [], 'groupbys': [], 'groups': []}]}], 'version': 13, 'format_version': 9, 'scripts': [{'name': 'Untitled', 'url': '/scripts/zkon.py', '_id': 'zkon', 'type': 'Python'}]}
Die Metastruktur in eine andere Form bringen #
In der Variable metadata ist nun die gesamte Metastruktur mit all seinen Elementen im JSON-Format gespeichert. SeaTable bzw. Python bietet selbstverständlich Möglichkeiten, um diese Strukturen zu durchlaufen und damit zu interagieren.
Mit den folgenden Zeilen lässt sich die Metastruktur in die gewünschte Form bringen.
print("--- COMPLETE BASE STRUCTURE WITH ALL BASES AND COLUMNS ---") for table in metadata['tables']: print('.') print("Table: "+table['name']+" (ID: "+table['_id']+")") for column in table['columns']: print(" --> "+column['name']+" ("+column['type']+")")
Was passiert hier genau? Als Erstes weisen wir Python an, sämtliche Tabellen mit einer for-Schleife zu durchlaufen. Als Nächstes geben wir mit print den Namen der Tabelle und dessen ID aus. Hier sieht man auch, wie man mit den eckigen Klammern auf die einzelnen Elemente zugreifen kann.
Das Gleiche wiederholt man für die Spalten. Durch die for-Schleife werden alle Spalten der jeweiligen Tabelle ausgegeben.
Ergänzung von Verlinkungen #
Jetzt sind wir schon fast am Ziel. Man könnte die Metastruktur bereits so gut verwenden, aber eine Schwäche des bisherigen Skriptes ist, dass bei Verlinkungs-Spalten nicht ersichtlich wird, wohin diese genau verlinken. Deshalb ersetzen wir die letzten beiden Spalten mit dem folgendem Code:
for column in table['columns']: link_target = "" if column['type'] == "link": link_target = " --> "+column['data']['other_table_id'] if column['data']['other_table_id'] == table['_id']: link_target = " --> "+column['data']['table_id'] print(" --> "+column['name']+" ("+column['type']+")")
Das komplette Skript #
Das vollständige Skript ist ohne Anpassungen unmittelbar in jeder SeaTable Tabelle lauffähig. Es wird Ihnen gute Hilfe leisten, wenn Sie im Community-Forum die Struktur Ihrer Base beschreiben wollen.
from seatable_api import Base, context base = Base(context.api_token, context.server_url) base.auth() metadata = base.get_metadata() print("--- COMPLETE BASE STRUCTURE WITH ALL BASES AND COLUMNS ---") for table in metadata['tables']: print('.') print("Table: "+table['name']+" (ID: "+table['_id']+")") for column in table['columns']: link_target = "" if column['type'] == "link": link_target = " --> "+column['data']['other_table_id'] if column['data']['other_table_id'] == table['_id']: link_target = " --> "+column['data']['table_id'] print(" --> "+column['name']+" ("+column['type']+link_target+")")