Я охотился за хорошими инструментами базы данных для выполнения того класса задач, который нам всем нужен, но в конечном итоге мы снова и снова внедряем его. Одной из таких задач является миграция базы данных. Я экспериментировал с 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 — фантастический инструмент для легкого управления миграциями.