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
|
|||
|
|
}
|