Mail.RuПочтаМой МирОдноклассникиИгрыЗнакомстваНовостиПоискВсе проекты

Программное обеспечение
с открытым исходным кодом

Это означает, что любой может заглянуть внутрь —
изучить, как работает программа, убедиться, что в ней
нет вирусов, и даже внести свои изменения.

На этом ресурсе собрана информация об открытых
разработках Mail.Ru Group и ее сотрудников.

Slick-migration

Slick-migration — библиотека с открытым исходным кодом, предназначенная для декларативного описания миграций схемы БД. Библиотека написана на Scala и предназначена для использования в проектах на платформе JVM, в первую очередь в Scala-проектах. В настоящее время активно используется в проекте Аллоды-онлайн.

Проект распространяется под лицензией MIT.

Для чего нужны миграции?

В большинстве развивающихся проектов, использующих БД, необходимо обеспечить управление скриптами изменений структуры БД, т.к. структура БД меняется вместе с самим проектом. Для этих целей используются различные подходы, от простых текстовых скриптов до довольно сложных систем. На платформе JVM существуют, например, такие библиотеки (более полный список на Википедии):

Однако в некоторых случаях существующие инструменты не очень хорошо вписываются в инфраструктуру проекта. Кроме того, в них отсутствуют некоторые желательные свойства.

Отличительные особенности Slick-migration

Библиотека slick-migration обладает следующими отличительными возможностями:

  • Объявление миграций в Scala-trait (в исходном коде) позволяет организовать совокупность миграций с помощью cake-паттерна;
  • Каждая миграция имеет уникальный URN-идентификатор;
  • Миграции могут объявлять зависимости явным образом и библиотека гарантирует их применение по порядку (согласно топологической сортировке);
  • Поддерживаются SQL-скрипты, использующие синтаксис PostgreSQL.

Эти возможности позволяют организовать такие интересные сценарии работы с миграциями:

  1. Компилируемые миграции особенно полезны при разработке функциональности приложения в ветках. Компилятор выдаст ошибку, если какая-то необходимая миграция не была замержена.
  2. Модульная схема БД с независимыми миграциями отдельных модулей.
    • Для тестирования большого приложения полезно создавать тестовые базы данных, содержащие только часть таблиц и данных. При этом необходимо производить миграции этих неполных по схеме баз данных.
    • Также это свойство позволяет создавать различные варианты deployment. Например, у одного клиента все модули базы развёрнуты в одной физической БД, а у другого, более крупного клиента, для каждого модуля создана отдельная БД.

Использование библиотеки

Программист в коде объявляет миграции, например:

val personTableCreated = migration("JIRA-1234", "personTableCreated").
  comment("create person table").
  sql("""CREATE TABLE person (id SERIAL, name TEXT);
        |CREATE INDEX person_name_idx ON person(name);
        |""".stripMargin)
val personTableAlterAddAge = migration("JIRA-1234", "personTableAlterAddAge").
  comment("add column age to person table").
  dependsOn(personTableCreated).
  sql("""ALTER TABLE person 
        |ADD COLUMN age INTEGER;
        |""".stripMargin)

и собирает все миграции в одну коллекцию:

val all = Seq(personTableAlterAddAge, personTableCreated)

После этого достаточно вызвать процесс миграций, чтобы привести БД в текущее состояние:

val migrationManager = createMigrationManager(all)
Await.result(Database.fromDatasource(...).run(migrationManager.upgradeDbio), 5.minutes)

Менеджер миграций проверит, какие миграции применены (в таблице applied_migrations), затем отсортирует с помощью алгоритма топологической сортировки оставшиеся миграции и выполнит их последовательно. После успешного выполнения каждой миграции, она записывается в таблицу applied_migrations, чтобы в будущем не применять эту же миграцию.

Что планируется реализовать

  • Поддержку других СУБД, а не только Postgres (в первую очередь из списка поддерживаемых Slick);
  • Привязку миграций к объектам БД, что упростит создание модульных схем БД;
  • Возможность рефакторинга старых миграций и создания bypass-миграций (которые заменяют несколько медленных миграций).

Ссылки