Эта статья знакомит вас с Python-скриптом, который выводит полную метаструктуру базы. Это полезно, например, если у вас возник вопрос о базе на форуме сообщества и вы хотите быстро и просто описать структуру базы без скриншотов.

Метаструктура базы описывает таблицы, колонки и представления базы. Записи в строках в метаструктуру не входят. Следующая JSON-структура описывает сравнительно простую базу, содержащую только одну таблицу, два столбца и одно представление.

{
    "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
                }
            }
        }
    }
}

Такой код, конечно, нецелесообразен при обращении за помощью на форум сообщества, поэтому структура этой таблицы должна быть сведена к следующим строкам.

--- COMPLETE BASE STRUCTURE WITH ALL BASES AND COLUMNS ---
Table: Table1 (ID: 0000)
--> Name (text)

Как именно это работает, вы можете узнать из этой статьи.

В SeaTable для получения метаструктуры базы достаточно всего нескольких строк кода Python. В частности, нескольких строк достаточно для аутентификации и одной строки для метаструктуры.

from seatable_api import Base, context
base = Base(context.api_token, context.server_url)
base.auth()
metadata = base.get_metadata()
print(metadata)

Однако результат или выход метаструктуры не является удобным для пользователя.

{'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'}]}

Переменная метаданных теперь хранит всю метаструктуру со всеми ее элементами в формате JSON. SeaTable и Python, конечно, предоставляют возможности для обхода этих структур и взаимодействия с ними.
С помощью следующих строк метаструктура может быть приведена к нужному виду.

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']+")")

Что именно здесь происходит? Во-первых, вы инструктируете Python создать все таблицы с помощью команды for-петля. Далее вводится число с помощью print имя таблицы и ее идентификатор. Здесь же показан доступ к отдельным элементам с помощью квадратных скобок.

Повторите то же самое для колонн. Через for-loop, выводятся все столбцы соответствующей таблицы.

Теперь вы почти у цели. Вы уже могли бы использовать эту метаструктуру, но недостатком предыдущего скрипта является то, что при связывании столбцов не очевидно, на что именно они ссылаются. Поэтому замените два последних столбца следующим кодом:

  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']+")")

Весь скрипт может быть запущен непосредственно в любой базе SeaTable без каких-либо настроек. Он пригодится вам, если вы захотите описать структуру своей базы на форуме сообщества.

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+")")