1
1
package database
2
2
3
3
import (
4
+ "context"
4
5
"database/sql"
5
6
"embed"
6
7
"errors"
@@ -17,12 +18,21 @@ import (
17
18
var migrations embed.FS
18
19
19
20
func migrateSetup (db * sql.DB ) (source.Driver , * migrate.Migrate , error ) {
21
+ ctx := context .Background ()
20
22
sourceDriver , err := iofs .New (migrations , "migrations" )
21
23
if err != nil {
22
24
return nil , nil , xerrors .Errorf ("create iofs: %w" , err )
23
25
}
24
26
25
- dbDriver , err := postgres .WithInstance (db , & postgres.Config {})
27
+ // there is a postgres.WithInstance() method that takes the DB instance,
28
+ // but, when you close the resulting Migrate, it closes the DB, which
29
+ // we don't want. Instead, create just a connection that will get closed
30
+ // when migration is done.
31
+ conn , err := db .Conn (ctx )
32
+ if err != nil {
33
+ return nil , nil , xerrors .Errorf ("postgres connection: %w" , err )
34
+ }
35
+ dbDriver , err := postgres .WithConnection (ctx , conn , & postgres.Config {})
26
36
if err != nil {
27
37
return nil , nil , xerrors .Errorf ("wrap postgres connection: %w" , err )
28
38
}
@@ -36,11 +46,22 @@ func migrateSetup(db *sql.DB) (source.Driver, *migrate.Migrate, error) {
36
46
}
37
47
38
48
// MigrateUp runs SQL migrations to ensure the database schema is up-to-date.
39
- func MigrateUp (db * sql.DB ) error {
49
+ func MigrateUp (db * sql.DB ) ( retErr error ) {
40
50
_ , m , err := migrateSetup (db )
41
51
if err != nil {
42
52
return xerrors .Errorf ("migrate setup: %w" , err )
43
53
}
54
+ defer func () {
55
+ srcErr , dbErr := m .Close ()
56
+ if retErr != nil {
57
+ return
58
+ }
59
+ if dbErr != nil {
60
+ retErr = dbErr
61
+ return
62
+ }
63
+ retErr = srcErr
64
+ }()
44
65
45
66
err = m .Up ()
46
67
if err != nil {
0 commit comments