Вы хотите перенести свои базы Airtable в SeaTable и боитесь усилий? Не волнуйтесь! Даже базы со сложной структурой данных и многими тысячами записей могут быть перенесены в SeaTable без особых усилий.
Мы разработали скрипт миграции для переноса данных Airtable в SeaTable. При этом все данные базы Airtable - таблицы, колонки, наборы данных - переносятся в базу SeaTable за один проход. После миграции можно продолжать работу в SeaTable с данными, которые в последний раз использовались в Airtable. После выполнения сценария требуется лишь незначительная доработка.
Сценарий может быть использован любым человеком - как техническим, так и нетехническим. Однако из-за ограничений со стороны API Airtable процедура, к сожалению, не является высокоавтоматизированной. Для того чтобы скрипт заработал, необходимо выполнить некоторые действия вручную. В этой статье мы расскажем, как это сделать.
Как перенести базу из Airtable в SeaTable
1. создать базу
Создайте новую базу в SeaTable. Имя базы SeaTable не обязательно должно совпадать с именем импортируемой базы Airtable. Вы можете выбрать имя произвольно.
2. вставить скрипт
Откройте администрирование скриптов в новой базе, щелкнув на значке скрипта в заголовке базы в правом верхнем углу. Затем выберите пункт Добавить скрипт. Сценарий миграции написан на языке программирования Python. Поэтому выберите Python.
airtable_api_key
просто такой Personal Access Token в. На это должно быть получено разрешение data.records:read
в наличии.Теперь выделите следующий блок кода, скопируйте его в буфер обмена, а затем вставьте в левое окно редактора сценариев:
## Параметризация сценария # SeaTable - Destination server_url = 'https://cloud.seatable.io' api_token = '...' # Добавляем API-токен базы SeaTable # См. https://seatable.io/docs/en/seatable-api/erzeugen-eines-api-tokens/ # для получения дополнительной информации о том, как создать API-токен SeaTable # Airtable - Источник airtable_api_key = '...' # Добавляем API-ключ базы Airtable # См. https://support.airtable.com/docs/creating-and-using-api-keys-and-access-tokens/ # для получения дополнительной информации о том, как создать API-ключ Airtable airtable_base_id = '...' # Добавить base_id базы Airtable # См. # Добавить base_id базы Airtable # См. https://support.airtable.com/docs/finding-airtable-ids/ # для получения дополнительной информации о том, где найти идентификатор базы Airtable table_names = ['...', '...'] # Добавьте имена всех таблиц в базе Airtable, т.е. ['table 1', 'table 2']. # Имена должны быть заключены в '' и разделены запятыми first_columns = [ ('...', '...'), ('...', '...'), ] # Укажите имена первых колонок в каждой таблице базы Airtable. # Используйте формат ('имя_таблицы', 'имя_первой_колонки'), т.е. ('таблица 1', 'ID') # Имя таблицы и столбца должно быть заключено в '' и разделено запятыми ссылки = [ ] # Укажите связи между таблицами в базе Airtable. # Используйте формат ('имя_таблицы', 'имя_столбца', 'имя_другой_таблицы'), т.е. ('таблица 1', 'ссылка на таблицу 2', 'таблица 2') # Имена таблиц и столбцов должны быть заключены в '' и разделены запятыми. # Если база Airtable не содержит колонок-связок, просто оставьте скобки пустыми mode = 'import-header # Указываем режим выполнения скрипта, два варианта: 'import-header' и 'import-rows' # Сначала выполняется 'import-header' для создания структуры данных в базе SeaTable # Запустите 'import-rows' для импорта всех строк ## После этой строки редактирование больше не требуется импортировать sys from seatable_api import Base, AirtableConvertor # from airtable_importer_settings import server_url, api_token, # airtable_api_key, airtable_base_id, table_names, first_columns, links def get_convertor(): base = base(api_token, server_url) base.auth() convertor = AirtableConvertor( airtable_api_key=airtable_api_key, airtable_base_id=airtable_base_id, base=base, table_names=table_names, first_columns=first_columns, left=left, ) return convertor def import_header(): convertor = get_convertor() convertor.convert_metadata() def import_rows(): convertor = get_convertor() convertor.convert_data() if mode == 'import-header': import_header() elif mode == 'import-rows': import_rows() else: print('Режим указан неверно.') ## Конец сценария ##
Не беспокойтесь, если вы не понимаете код. Мы объясним его. Комментарии в коде должны немного помочь в интерпретации. Комментарии - это все строки с ведущим знаком хеша ('#'). Эти строки игнорируются при выполнении скрипта, т.е. вы можете изменять комментарии и добавлять новые.
В отличие от комментариев, отступы в коде очень важны при выполнении скрипта. Пожалуйста, не изменяйте их.
3. укажите URL-адрес сервера SeaTable и API-токен базы.
В комментарии SeaTable - Destination добавьте URL-адрес сервера SeaTable и укажите API-токен. Если вы используете SeaTable Cloud, то правильным будет предварительно заполненный URL "https://cloud.seatable.io". Если вы используете другой сервер SeaTable, то введите его URL. (URL всегда должен вводиться с https:// или http://.) URL и токен должны быть заключены в одинарные кавычки.
Это пример конфигурации при использовании SeaTable Cloud:
4. введите API-ключ Airtable и идентификатор базы
Под комментарием Airtable - Source добавьте ключ Airtable API и идентификатор Airtable Base ID, оба значения снова заключите в одинарные кавычки.
Вот как это должно выглядеть:
5. введите имена таблиц и столбцов
Теперь укажите скрипту, какие таблицы необходимо импортировать. Сделайте это в строке "table_names". В квадратные скобки добавьте имена таблиц базы airtable - каждое из них заключено в одну перевернутую запятую и разделено запятой.
Для базы с двумя таблицами "Таблица 1" и "Таблица 2" строка должна выглядеть, например, так:
Если ваша база airtable содержит более двух таблиц, просто расширьте перечисление в скобках.
В связи с ограничением API Airtable необходимо также указывать имена первых столбцов таблиц. Это делается в строке "first_columns" или в следующих строках.
Для базы airtable с двумя таблицами "table 1" и "table 2" это может выглядеть следующим образом:
6. определить колонки ссылок
Для того чтобы SeaTable корректно импортировал данные, необходимо выполнить еще один шаг: указать колонки связей в Airtable Base.
Для этого предназначена строка "left". Если, например, столбец "ссылка на таблицу 2" в таблице "Таблица 1" отображает ссылку на таблицу "Таблица 2", то скрипт должен быть параметризован следующим образом:
Каждую пару столбцов ссылок необходимо указывать только один раз. Не обязательно указывать связь в обоих направлениях.
Если в базу Airtable Base не поступают колонки ссылок, то квадратную скобку можно оставить пустой:
7. импорт таблиц и столбцов
Скрипт может выполняться в двух режимах: "import-header" и "import-rows". Во-первых, скрипт всегда должен выполняться в режиме "import-header". В этом режиме в SeaTable Base создаются таблицы и колонки и импортируются 10 тестовых строк.
Режим выполнения задается в одноименной строке:
Теперь выполните сценарий, нажав на кнопку Execute script. Во время выполнения сценария в редакторе справа видны шаги, которые были выполнены. В фоновом режиме также видно, как создаются таблицы и столбцы.
8. проверка контрольных линий
Теперь проверьте, есть ли
- все таблицы и все столбцы были импортированы,
- во всех таблицах создана правильная первая строка и
- столбцы ссылок корректны.
Поскольку типы столбцов в Airtable и SeaTable не полностью совпадают, некоторые типы столбцов в SeaTable Base будут отличаться от типов столбцов в Airtable Base. В следующей таблице показано, как типы столбцов из Airtable переносятся в SeaTable.
Тип колонны с воздушным столом | Импорт в SeaTable Тип столбца |
---|---|
Приложение | Файл |
Автонумерация | Номер (Возможно преобразование в колонку номеров автомобилей) |
Штрих-код | Текст или номер |
Кнопка | - (миграция невозможна) |
Флажок | Флажок |
Граф | Номер |
Время создания | Дата |
Валюта | Номер |
Дата | Дата |
Продолжительность | Число (Возможно преобразование в столбец типа duration) |
Электронная почта | Электронная почта |
Формула | Дата, текст или номер |
Последнее изменение | Текст |
Время последнего изменения | Дата |
Ссылка на другую запись | Ссылка на другие записи |
Длинный текст | Форматированный текст |
Поиск | Дата, текст или номер |
Множественный выбор | Множественный выбор (Без переноса неиспользуемых опций) |
Номер | Номер |
Процент | Номер |
Номер телефона | Текст или номер |
Рейтинг | Номер (возможно преобразование в столбец типа рейтинг) |
Рулонный | Дата, текст или номер |
Однострочный текст | Текст |
Однократный выбор | Текст (Возможно преобразование в один столбец выделения) |
Пользователь | Текст |
URL | Текст |
Если что-то не так, то проверьте записи в шагах 5. и 6. и запустите скрипт еще раз в режиме "import-header".
9. импортировать все записи
Если проверка, выполненная на шаге 8., вас удовлетворила, то все записи могут быть переданы.
В скрипте измените режим с "import-header" на "import-rows":
Снова выполните сценарий, нажав на кнопку Run Script. Вновь можно наблюдать выполнение сценария в правой части и видеть действия в фоновом режиме.
Теперь вы должны увидеть все записи из базы Airtable в новой базе SeaTable. Поздравляем, миграция наборов данных завершена!
Если конечный результат вас не устраивает, удалите все таблицы и начните сначала с шага 7.
10. завершить миграцию
Сценарий миграции перенес все данные. Возможно, еще потребуется выполнить некоторые ручные настройки.
Сценарий миграции не переносит столбцы формул как столбцы формул, а создает текстовые столбцы и вставляет в них результаты формул. Это означает, что теперь в SeaTable Base необходимо добавлять колонки формул вручную. То же самое относится к столбцам типа Count, Lookup и Rollup. Кнопочные столбцы не переносятся вообще.
Поскольку порядок колонок не может быть получен через Airtable API, эта информация, к сожалению, недоступна при создании колонок в SeaTable. Если вы хотите восстановить исходный порядок, вам придется сделать это вручную.
Представления из базы Airtable Base не передаются. Вы должны создавать представления самостоятельно.
Область часто задаваемых вопросов
Изменяет ли скрипт данные в моей базе Airtable?
Нет. Скрипт считывает только вашу базу airtable. Данные в базе airtable не изменяются.
Что делать, если появляется сообщение об ошибке?
Появление сообщения об ошибке при первом выполнении вовсе не является маловероятным. Причин для этого достаточно, например, неверный API-токен, неправильный порядок ссылок, опечатки, пропущенные запятые, неправильный отступ. Одна-единственная ошибка может привести к прерыванию выполнения скрипта.
Если вы получаете сообщение об ошибке, то это, по сути, не проблема. Данные не могут быть потеряны. Выполните следующие действия:
- В большинстве случаев в сообщении об ошибке будет дана подсказка, где искать ошибку. Следуя ей, исправьте введенные параметры и запустите скрипт снова. Например, ошибка отступа указывает на то, что отступ не соответствует синтаксису Python.
- Если сообщение об ошибке непонятно, проверьте правильность всех записей и повторите попытку.
- Если ни один из советов не помог, обратитесь за помощью в Форум SeaTable.
Можно ли не учитывать пробелы в основании воздушного стола?
Да, такое может происходить со столбцами, содержащими всего несколько записей. В режиме import-header скрипт проверяет первые 100 строк базы airtable. Если столбец не содержит записи в этих строках, то API Airtable не возвращает этот столбец и соответствующий столбец не создается в SeaTable. Соответственно, он не учитывается при миграции всех наборов данных.
Можно ли переносить базы Airtable любого размера?
В принципе, да. Однако представленная в этой статье процедура с использованием встроенного редактора Python имеет ограничение по времени выполнения - 15 минут, т.е. скрипты, выполняющиеся дольше 15 минут, прерываются. На практике этого достаточно для подавляющего большинства баз. Однако для баз с большим количеством вложенных файлов это ограничение может сыграть свою роль.
Можно ли импортировать таблицы в существующую базу?
Скрипт не требует, чтобы база была пустой. Поэтому скрипт можно запускать и в базе с существующими заполненными таблицами. Единственное, чего следует избегать, - это дублирования имен таблиц.