54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
// Команда migrate — накат схемы без запуска API.
|
||
package main
|
||
|
||
// Разовая команда: применить миграции, не поднимая API.
|
||
// Нужна CI (таблицы должны существовать до интеграционных тестов)
|
||
// и любому процессу, который накатывает схему без запуска сервера:
|
||
//
|
||
// go run ./cmd/migrate
|
||
//
|
||
// Тот же код, что выполняется при старте cmd/api, — расхождений
|
||
// между «как стартует приложение» и «как накатывает CI» нет.
|
||
|
||
import (
|
||
"context"
|
||
"os"
|
||
|
||
"github.com/joho/godotenv"
|
||
|
||
"building-mgmt/internal/db"
|
||
"building-mgmt/internal/logging"
|
||
)
|
||
|
||
func main() {
|
||
os.Exit(run())
|
||
}
|
||
|
||
// run возвращает код выхода, а не вызывает os.Exit внутри: так defer
|
||
// (закрытие пула) отрабатывает до завершения процесса.
|
||
func run() int {
|
||
_ = godotenv.Load()
|
||
logger := logging.Setup()
|
||
|
||
dsn := os.Getenv("DATABASE_URL")
|
||
if dsn == "" {
|
||
logger.Error("DATABASE_URL is not set")
|
||
return 1
|
||
}
|
||
|
||
ctx := context.Background()
|
||
pool, err := db.Connect(ctx, dsn)
|
||
if err != nil {
|
||
logger.Error("db connect failed", "err", err)
|
||
return 1
|
||
}
|
||
defer pool.Close()
|
||
|
||
if err := db.Migrate(ctx, pool); err != nil {
|
||
logger.Error("migrations failed", "err", err)
|
||
return 1
|
||
}
|
||
logger.Info("schema is up to date")
|
||
return 0
|
||
}
|