aboutsummaryrefslogtreecommitdiffstats
path: root/internal/db/db.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/db/db.go')
-rw-r--r--internal/db/db.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/internal/db/db.go b/internal/db/db.go
new file mode 100644
index 0000000..44d489b
--- /dev/null
+++ b/internal/db/db.go
@@ -0,0 +1,43 @@
+// Package db opens the Postgres pool and applies embedded migrations.
+package db
+
+import (
+ "context"
+ "database/sql"
+ "embed"
+ "fmt"
+
+ "github.com/jackc/pgx/v5/pgxpool"
+ _ "github.com/jackc/pgx/v5/stdlib"
+ "github.com/pressly/goose/v3"
+)
+
+//go:embed migrations/*.sql
+var migrations embed.FS
+
+func Open(ctx context.Context, url string) (*pgxpool.Pool, error) {
+ pool, err := pgxpool.New(ctx, url)
+ if err != nil {
+ return nil, fmt.Errorf("connect: %w", err)
+ }
+ if err := pool.Ping(ctx); err != nil {
+ pool.Close()
+ return nil, fmt.Errorf("ping: %w", err)
+ }
+ return pool, nil
+}
+
+// Migrate applies all pending migrations using goose over database/sql.
+func Migrate(ctx context.Context, url string) error {
+ sqldb, err := sql.Open("pgx", url)
+ if err != nil {
+ return err
+ }
+ defer sqldb.Close()
+ goose.SetBaseFS(migrations)
+ goose.SetLogger(goose.NopLogger())
+ if err := goose.SetDialect("postgres"); err != nil {
+ return err
+ }
+ return goose.UpContext(ctx, sqldb, "migrations")
+}