Golang migrate.New как указывать параметры для Clickhouse если базы еще нет и ее создаем в миграции
Если база данных ClickHouse ещё не существует и вы хотите создать её в миграции, есть несколько способов корректно настроить процесс с использованием библиотеки migrate
. Проблема в том, что migrate.New
ожидает, что база данных, указанная в строке подключения, уже существует.
Подходы к решению
- Использовать отдельное подключение для создания базы данных Создайте базу данных перед запуском миграций с помощью отдельного подключения. Для этого укажите строку подключения без имени базы данных.
Пример:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051package mainimport ("context""log""github.com/golang-migrate/migrate/v4"_ "github.com/golang-migrate/migrate/v4/database/clickhouse"_ "github.com/golang-migrate/migrate/v4/source/file""github.com/ClickHouse/clickhouse-go/v2")func main() {// Подключение без имени базы данныхdsn := "clickhouse://default:@localhost:9000"// Создание базы данных перед миграциейconn, err := clickhouse.Open(&clickhouse.Options{Addr: []string{"localhost:9000"},})if err != nil {log.Fatalf("Failed to connect to ClickHouse: %v", err)}ctx := context.Background()_, err = conn.Exec(ctx, "CREATE DATABASE IF NOT EXISTS my_database")if err != nil {log.Fatalf("Failed to create database: %v", err)}log.Println("Database created successfully!")// Путь к миграциямmigrationsPath := "file:///path/to/your/migrations"// Подключение с именем базы данныхdsnWithDatabase := "clickhouse://default:@localhost:9000/my_database"// Создание миграцииm, err := migrate.New(migrationsPath, dsnWithDatabase)if err != nil {log.Fatalf("Failed to create migration instance: %v", err)}// Применение миграцийif err := m.Up(); err != nil && err != migrate.ErrNoChange {log.Fatalf("Failed to apply migrations: %v", err)}log.Println("Migrations applied successfully!")} - Указать пустую базу в строке подключения В некоторых случаях можно использовать
default
или другую системную базу ClickHouse как временное подключение для выполнения миграций.Пример строки подключения:
12dsn := "clickhouse://default:@localhost:9000/default"Затем в первой миграции создаётся нужная база данных, например:
Миграция
0001_create_database.up.sql
:12CREATE DATABASE IF NOT EXISTS my_database;Миграция
0001_create_database.down.sql
:12DROP DATABASE IF EXISTS my_database; - Создание базы в первой миграции Вы можете указать
default
как базу в строке подключения, а саму базу создать в первой миграции. При этом путь к миграциям остаётся неизменным:123migrationsPath := "file:///path/to/your/migrations"dsn := "clickhouse://default:@localhost:9000/default"Тогда ваша первая миграция создаёт базу данных и таблицы.
Примечания
- Лучший подход: Обычно базы данных создаются вручную или с помощью CI/CD процессов перед запуском приложения, а миграции отвечают только за структуру таблиц и данных.
- Безопасность: При создании базы в коде убедитесь, что права доступа пользователя позволяют это сделать.
- Тестирование: Проверьте миграции на тестовом окружении, чтобы убедиться, что создаваемая база корректно подключается.
Выберите подход, который лучше всего соответствует вашим требованиям.