package database import ( "fmt" "log" "serv_golang_rest_api/internal/config" "serv_golang_rest_api/internal/model" "gorm.io/driver/postgres" "gorm.io/gorm" ) func NewPostgresConnection(cfg *config.Config) (*gorm.DB, error) { dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=UTC", cfg.DBHost, cfg.DBUser, cfg.DBPassword, cfg.DBName, cfg.DBPort) db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { return nil, fmt.Errorf("failed to connect to database: %w", err) } // Автомиграция if err := autoMigrate(db); err != nil { return nil, err } log.Println("Successfully connected to database") return db, nil } func autoMigrate(db *gorm.DB) error { // Сначала добавляем колонку как NULLABLE if err := db.Exec(`ALTER TABLE users ADD COLUMN IF NOT EXISTS password VARCHAR(255)`).Error; err != nil { return err } // Затем обновляем существующие записи (если нужно установить дефолтное значение) if err := db.Exec(`UPDATE users SET password = '' WHERE password IS NULL`).Error; err != nil { return err } // И только потом меняем на NOT NULL if err := db.Exec(`ALTER TABLE users ALTER COLUMN password SET NOT NULL`).Error; err != nil { return err } // Или используйте автоматические миграции GORM return db.AutoMigrate( &model.User{}, // другие модели... ) }