Когда команда ItFox работала над проектом Velo – сервисом доставки а-ля «Яндекс.Еда» только для Нигерии, с технической стороны проект оказался нетривиальным — особенно на старте, когда закладывались ключевые архитектурные решения.
Один из серьезных вызовов, с которым мы столкнулись, — конфликт между Alembic и PostGIS. Ниже делимся, как решали проблему, что пробовали, и к какому решению пришли в итоге.
На Velo мы использовали PostgreSQL как основную СУБД. Так как сервис доставки по определению работает с геоданными, нам понадобилось расширение PostGIS — оно добавляет поддержку пространственных типов данных и операций к PostgreSQL. Он может хранить точки, линии, полигоны, различные 3D-объекты, может работать с координатами в различных системах и прочее.
Параллельно с этим мы использовали Alembic — стандартный инструмент для управления миграциями в SQLAlchemy. Именно он и стал источником основной боли.
Чтобы объяснить, как работает Alembic, давайте начнем с простой аналогии.
Представьте себе Excel-файл. В нем есть таблицы — например, «Пользователи». У этой таблицы есть столбцы: имя, фамилия, номер телефона. Сама таблица — это наша база данных, а столбцы — это структура (схема), которая определяет, какие данные можно туда записывать.
Как это обычно бывает, на этапе активной разработки база данных часто меняется. Например, продуктовая команда решила добавить новое поле — дату рождения клиента, чтобы создавать триггерные события. Просто так открыть базу и добавить колонку нельзя — особенно если проект уже в продакшен. Нужно зафиксировать изменение, чтобы другие члены команды могли воспроизвести его у себя локально и на боевых серверах.
Здесь и вступает в игру Alembic — инструмент, который позволяет создавать миграции: пошаговые инструкции по изменению структуры базы. Это могут быть добавление или удаление колонок, создание новых таблиц, изменение индексов и прочее.
От инструмента миграций требуется надежность и предсказуемость. А в нашем случае произошло следующее. PostGIS работает на уровне PostgreSQL и у него есть свои таблицы, индексы, схемы, триггеры и прочие компоненты для его полноценной работы. Alembic «не понимал», что это системные объекты и считал, что эти объекты нужно обработать. В результате получались миграции на 1000+ строк бессмысленного кода, содержащие команды по «удалению» встроенных в PostGIS объектов.
Особенно это мешало в начале проекта, когда таблицы создавались часто — каждый такой коммит требовал ручной чистки миграций или отката.
Наша система сама подберет вам исполнителей на услуги, связанные с разработкой сайта или приложения, поисковой оптимизацией, контекстной рекламой, маркетингом, SMM и PR.
Заполнить заявку
13201 тендер
проведено за восемь лет работы нашего сайта.
Путь к решению был не самым прямым. Сначала мы пошли по классике:
Что-то из этого работало частично. Некоторые решения выглядели как костыли. Но ни одно из них не обеспечивало стабильной и чистой миграции.
Ключевая мысль пришла после глубокого изучения документации GeoAlchemy. Там вскользь упоминалось, что универсального решения нет — каждый проект вынужден решать эту проблему по-своему.
Наша идея заключалась в том, чтобы перехватывать объекты миграции до их генерации и исключать из них все, что связано с PostGIS.
Мы написали кастомный Alembic-хелпер, который:
Этот скрипт стал частью нашей стандартной инфраструктуры миграций. Он работает в фоновом режиме, не мешает основной разработке, и избавил команду от необходимости вручную чистить каждую автосгенерированную миграцию.
Кастомный Alembic-хелпер — один из примеров, как команда ItFox системно решает задачи. Готовы обсудить ваш проект и предложить архитектуру, которая выдержит не только MVP, но и зрелый highload-продукт. Записывайтесь на бесплатную консультацию или напишите нам в Телеграм.