From 4ad982a6e7ec0108181b5d6e76259f08f4dcc598 Mon Sep 17 00:00:00 2001 From: Timothy Drago Date: Wed, 16 Jul 2025 16:03:12 +0200 Subject: [PATCH 1/4] WIP optional run migrations --- v2/dbutils/dbutils.go | 68 +++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/v2/dbutils/dbutils.go b/v2/dbutils/dbutils.go index 8f66b3d..ca40e11 100644 --- a/v2/dbutils/dbutils.go +++ b/v2/dbutils/dbutils.go @@ -154,34 +154,24 @@ type DB struct { // Open opens a database connection given a config struct // It expects a fs.FS in order to fetch and run the DB migrations // If you don't need them, just pass nil instead -func Open(conf DBConfig, fsys fs.FS) (*DB, int64, error) { +func Open(conf DBConfig, fsys fs.FS, runMigrations bool) (db *DB, err error) { if conf.Driver == "" { - return nil, 0, errors.New("no SQL driver specified: please use one of [mssql,postgres]") + return nil, errors.New("no SQL driver specified: please use one of [mssql,postgres]") } connectionString := fromDBConfToConnectionString(conf) if connectionString == "" { - return nil, 0, errors.New("unsupported driver: " + conf.Driver) + return nil, errors.New("unsupported driver: " + conf.Driver) } - // Init Goose - err := goose.SetDialect(conf.Driver) - if err != nil { - return nil, -1, fmt.Errorf("set migrations dialect: %w", err) - } - - goose.SetBaseFS(fsys) - - currentVersion := int64(-1) - - var db *sql.DB + var sqlDB *sql.DB // Make sure the DB is actually reachable for _, delay := range connectionRetries { - db, err = sql.Open(conf.Driver, connectionString) + sqlDB, err = sql.Open(conf.Driver, connectionString) if err == nil { - err = db.Ping() + err = sqlDB.Ping() if err == nil { break } @@ -189,34 +179,42 @@ func Open(conf DBConfig, fsys fs.FS) (*DB, int64, error) { time.Sleep(delay * time.Second) } if err != nil { - return nil, -1, fmt.Errorf("reaching DB server: %w", err) + return nil, fmt.Errorf("reaching DB server: %w", err) } + db = &DB{DB: sqlDB, conf: conf, fsys: fsys} // DB should be ready, run migrations if needed - if conf.Migrations.Run { - // Goose wants to use the "sqlserver" driver, never "mssql" - driver := conf.Driver - if driver == "mssql" { - driver = "sqlserver" - } - db, err := sql.Open(driver, connectionString) + if conf.Migrations.Run && runMigrations { + err = db.Migrate() if err != nil { - return nil, -1, fmt.Errorf("open db for migrations: %w", err) + return nil, fmt.Errorf("cannote run db migrations: %w", err) } - defer db.Close() + } - currentVersion, err = goose.GetDBVersion(db) - if err != nil { - return nil, -1, fmt.Errorf("get db version: %w", err) - } + return db, nil +} - err = goose.Up(db, conf.Migrations.Path) - if err != nil { - return nil, -1, fmt.Errorf("migrate db: %w", err) - } +func (d *DB) Migrate() (err error) { + // Init Goose + err = goose.SetDialect(d.conf.Driver) + if err != nil { + return fmt.Errorf("set migrations dialect: %w", err) } - return &DB{DB: db, conf: conf, fsys: fsys}, currentVersion, nil + goose.SetBaseFS(d.fsys) + + // Goose wants to use the "sqlserver" driver, never "mssql" + driver := d.conf.Driver + if driver == "mssql" { + driver = "sqlserver" + } + + err = goose.Up(d.DB, d.conf.Migrations.Path) + if err != nil { + return fmt.Errorf("migrate db: %w", err) + } + + return nil } // Convert the database configuration to connection string From 2ece0215d9af19f4c0806a9ddad258fb59d3b235 Mon Sep 17 00:00:00 2001 From: Timothy Drago Date: Wed, 16 Jul 2025 16:38:08 +0200 Subject: [PATCH 2/4] set default table name --- v2/dbutils/dbutils.go | 1 + 1 file changed, 1 insertion(+) diff --git a/v2/dbutils/dbutils.go b/v2/dbutils/dbutils.go index ca40e11..6026218 100644 --- a/v2/dbutils/dbutils.go +++ b/v2/dbutils/dbutils.go @@ -202,6 +202,7 @@ func (d *DB) Migrate() (err error) { } goose.SetBaseFS(d.fsys) + goose.SetTableName(goose.DefaultTablename) // Goose wants to use the "sqlserver" driver, never "mssql" driver := d.conf.Driver From bf1151b0bf019fe115a01beb619912e61972e2b6 Mon Sep 17 00:00:00 2001 From: Timothy Drago Date: Thu, 17 Jul 2025 09:31:59 +0200 Subject: [PATCH 3/4] remove runMigrations parameter --- v2/dbutils/dbutils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v2/dbutils/dbutils.go b/v2/dbutils/dbutils.go index 6026218..75c3e3c 100644 --- a/v2/dbutils/dbutils.go +++ b/v2/dbutils/dbutils.go @@ -154,7 +154,7 @@ type DB struct { // Open opens a database connection given a config struct // It expects a fs.FS in order to fetch and run the DB migrations // If you don't need them, just pass nil instead -func Open(conf DBConfig, fsys fs.FS, runMigrations bool) (db *DB, err error) { +func Open(conf DBConfig, fsys fs.FS) (db *DB, err error) { if conf.Driver == "" { return nil, errors.New("no SQL driver specified: please use one of [mssql,postgres]") } @@ -184,7 +184,7 @@ func Open(conf DBConfig, fsys fs.FS, runMigrations bool) (db *DB, err error) { db = &DB{DB: sqlDB, conf: conf, fsys: fsys} // DB should be ready, run migrations if needed - if conf.Migrations.Run && runMigrations { + if conf.Migrations.Run { err = db.Migrate() if err != nil { return nil, fmt.Errorf("cannote run db migrations: %w", err) From b57f966df0dbe1d5fa04494186c048e024964fdc Mon Sep 17 00:00:00 2001 From: Timothy Drago Date: Thu, 17 Jul 2025 10:22:18 +0200 Subject: [PATCH 4/4] migrate use fsys --- v2/dbutils/dbutils.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/v2/dbutils/dbutils.go b/v2/dbutils/dbutils.go index 75c3e3c..da81b84 100644 --- a/v2/dbutils/dbutils.go +++ b/v2/dbutils/dbutils.go @@ -185,22 +185,27 @@ func Open(conf DBConfig, fsys fs.FS) (db *DB, err error) { db = &DB{DB: sqlDB, conf: conf, fsys: fsys} // DB should be ready, run migrations if needed if conf.Migrations.Run { - err = db.Migrate() - if err != nil { - return nil, fmt.Errorf("cannote run db migrations: %w", err) + if fsys != nil { + err = db.Migrate(fsys) + if err != nil { + return nil, fmt.Errorf("cannote run db migrations: %w", err) + } } } return db, nil } -func (d *DB) Migrate() (err error) { +func (d *DB) Migrate(fsys fs.FS) (err error) { + if !d.conf.Migrations.Run { + return nil + } // Init Goose err = goose.SetDialect(d.conf.Driver) if err != nil { return fmt.Errorf("set migrations dialect: %w", err) } - + d.fsys = fsys goose.SetBaseFS(d.fsys) goose.SetTableName(goose.DefaultTablename) @@ -275,7 +280,7 @@ func (d *DB) Up() error { // Version return the current DB version func (d *DB) Version() (int64, error) { if d.fsys == nil { - return -1, errors.New("can't get current version: no file system was passed to Open()") + return -1, nil } return goose.GetDBVersion(d.DB) }