Не многие команды разработчиков знают о существовании пакета 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-файлов во время выполнения. Это упрощает процесс тестирования и облегчает написание автоматизированных тестов.
Читайте также:
- Переход на PgCat — прокси-сервер Postgres следующего поколения
- 5 проектов Go: управление безопасностью и контейнерами, создание бэкендов
- Как стать разработчиком Go: в 6 шагах от карьеры
Читайте нас в Telegram, VK и Дзен
Перевод статьи David Lee: A Powerful but Barely Known Go Package that can Help you Do SQL Migrations