Источник: Nuances of Programming
Не многие команды разработчиков знают о существовании пакета 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-файлов во время выполнения. Это упрощает процесс тестирования и облегчает написание автоматизированных тестов.
Читайте также:
Перевод статьи David Lee: A Powerful but Barely Known Go Package that can Help you Do SQL Migrations