Статьи

Гусь для миграции баз данных

Я охотился за хорошими инструментами базы данных для выполнения того класса задач, который нам всем нужен, но в конечном итоге мы снова и снова внедряем его. Одной из таких задач является миграция базы данных. Я экспериментировал с Goose, чтобы обеспечить поддержку миграции базы данных общего назначения.

Что такое гусь?

Goose — менеджер миграции базы данных общего назначения. Идея проста:

  • Вы предоставляете файлы схемы SQL, которые следуют определенному соглашению об именах
  • Вы предоставляете простой dbconf.ymlфайл, который говорит Goose, как подключиться к вашим различным базам данных
  • Goose предоставляет вам простые инструменты для обновления схемы ( goose up), проверки ( goose status) и даже возврата ( goose down).

Goose делает это, добавляя еще одну таблицу в вашу базу данных. Эта таблица отслеживает, какие изменения схемы она сделала. Основываясь на своей истории, он может сказать, какие обновления схемы нужно запустить, а какие уже были запущены.

Хотя Goose написан на Go (golang), он не знает, на каком языке написано ваше приложение.

Начиная

Я запустил Goose менее чем за 30 минут, и вы, вероятно, сможете сделать это быстрее.

У меня уже есть пустая база данных Postgres foo. Но у него нет таблиц. У меня тоже есть кодовая база ( MyProject). Вот процесс настройки Goose для управления схемой базы данных.

Сначала я создаю db/каталог, в котором будут храниться все специфичные для Goose файлы, включая мою схему.

$ cd MyProject
$ mkdir db
$ cd db
$ vim dbconf.yml # Open with the editor of your choice.

dbconf.ymlФайл содержит список баз данных вместе с соответствующей информацией для подключения к каждому. Мой выглядит примерно так:

test:
  driver: postgres
  open: user=foo dbname=foo_test sslmode=disable

development:
  driver: postgres
  open: user=foo dbname=foo_dev sslmode=disable

(Важно: в YAML используйте пробелы, а не символы табуляции.)

Теперь у меня настроены две базы данных. Один для тестирования и один для разработки. По умолчанию Goose предполагает, что целевой базой данных является development.

Вышеуказанное просто настроено для соединения с экземпляром PostgreSQL, работающим локально. Если мне нужна поддержка для удаленного хоста, я могу добавить host=... password=...(и удалить sslmode=disable).

На этом этапе я могу создать новую миграцию.

$ cd .. # Back to MyProject/, not in db/
$ goose create NewSchema sql
goose: created db/migrations/20140311133014_NewSchema.sql
$ vim db/migrations/20140311133014_NewSchema.sql # Use whatever editor you like

Обратите внимание, что goose createкоманда создаст новый файл SQL, который следует соглашению об именах Goose. ( sqlВажно, что трейлинг в команде. goose createМожет также генерировать goфайлы миграции)

Мой новый файл схемы имеет два раздела: раздел для goose upи раздел для отката goose down:

-- +goose Up
CREATE TABLE foo (
  -- ...
);

-- +goose Down
DROP TABLE foo;

После этого я теперь очень легко могу создать developmentбазу данных:

$ goose up

Если я хочу установить testвместо этого, я использую -envфлаг:

$ goose -env=test up

Вот и все! В последующих файлах схемы я могу использовать ALTERсуществующие или CREATEновые таблицы и т. Д. Почти все, что может выполнить ваш движок SQL, может быть передано через Goose. (Хотя есть некоторые аннотации форматирования, которые вам нужно использовать для таких вещей, как хранимые процедуры.)

Goose Pros

В дополнение к общей простоте использования Goose, вот некоторые дополнительные функции, которые мне действительно нравятся:

  • Вам не нужна вся ваша кодовая база для выполнения Goose. Например, в нашем окне развертывания есть толькоdb/ каталог Goose , а не остальная часть кода.
  • Это в значительной степени не зависит от языка, если вы просто переносите SQL.
  • Он работает с PostgreSQL, MySQL и SQLite.
  • Создаваемая им таблица истории удобочитаема человеком, поэтому мне легко увидеть, что происходит.
  • Он поддерживает интерполяцию переменных среды. Не хотите, чтобы ваш пароль был внутри dbconf.ymlфайла? Просто сделайте что-то вроде этого:
development:
  driver: postgres
  open: user=foo dbname=foo_dev sslmode=disable password=$MY_DB_PASSWORD

Это заставит Goose проверить окружение на наличие переменной с именем $MY_DB_PASSWORD.

Гусиные минусы

Честно говоря, у меня очень мало.

  • Прямо сейчас вам нужна среда исполнения Go для установки и сборки Goose. Конечно, вы можете скомпилировать Goose один раз, а затем использовать его где угодно.
  • Хотя он поддерживает миграцию языка Go, было бы неплохо иметь возможность писать сценарии миграции, которые выполняются через оболочку. Таким образом, можно использовать Bash, Python, Perl или что-то еще для запуска миграции. Но, эй … это довольно незначительная жалоба.

В целом, однако, Goose — фантастический инструмент для легкого управления миграциями.