Не многие команды разработчиков знают о существовании пакета Go, который можно использовать для выполнения SQL-миграций.

В файле migration.go имеется следующий код:

Пакет, о котором идет речь, называется embed (более подробная информация в документации).

Пакет embed появился в Go 1.16. Он предоставляет возможность встраивать файлы и каталоги в бинарные файлы Go. В данном случае пакет embed используется для встраивания файлов миграции SQL в бинарный файл.

Директива //go:embed *.sql  —  это специальный комментарий, который указывает компилятору Go включить все файлы с расширением .sql во встроенную файловую систему. Доступ к встроенным файлам можно получить с помощью типа embed.FS.

Переменная FS  —  это глобальная переменная типа embed.FS, в которой хранится встроенная файловая система. Переменная FS может использоваться для доступа к встроенным файлам во время выполнения программы.

Обычно sql-файл создается вместе с пакетом миграций (migrations) в той же папке.

Использование пакета embed может упростить дистрибуцию и развертывание программы на языке Go, поскольку избавляет от необходимости распространять отдельные файлы вместе с бинарным файлом. Вместо этого все необходимые файлы могут быть включены в сам бинарный файл.

Как вызывать миграции?

Внутри файла main.go можно вызывать миграции с помощью функции MigrateDB. Пример:

Ниже показано, как определена функция:

Обратите внимание: в функции MigrateDB используется интерфейс fs.FS для обеспечения более универсального способа работы с файловыми системами, а embed.FS  —  для встраивания файлов и каталогов в бинарный файл Go.

Можно ли не использовать пакет embed?

Хотя для включения файлов в программу на языке Go можно использовать и другие методы, например чтение файлов с диска или включение их в виде активов в отдельный файл, пакет embed позволяет упростить этот процесс и облегчить управление программой и ее дистрибуцию.

Преимущества пакета embed

Упрощенная дистрибуция

Встраивание файлов миграции SQL в бинарный файл позволяет распространять один бинарный файл вместо бинарного файла и отдельных файлов SQL. Это упрощает процесс дистрибуции и облегчает развертывание приложения.

Повышение безопасности

Встраивание файлов миграции SQL в бинарный файл позволяет повысить уровень безопасности за счет снижения риска атак типа SQL-инъекций. Поскольку SQL-код компилируется в бинарный файл, злоумышленнику сложнее модифицировать SQL-код.

Оптимизация контроля версий

Включив файлы миграции SQL в проект Go, можно управлять ими с помощью средств контроля версий, таких как Git. Это поможет отслеживать изменения в файлах миграции и при необходимости откатывать изменения.

Упрощение тестирования

Встраивание файлов миграции SQL в бинарный файл может упростить тестирование приложения, поскольку не нужно беспокоиться о поиске SQL-файлов во время выполнения. Это упрощает процесс тестирования и облегчает написание автоматизированных тестов.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи David Lee: A Powerful but Barely Known Go Package that can Help you Do SQL Migrations

Предыдущая статьяАвтоматизация скриншот-тестирования предварительных просмотров Compose с использованием отражения
Следующая статья5 недооцененных возможностей JavaScript