ikurotime / gitgud

public
main / internal/infra/persistence/sqlite/db.go
852 B · Go Raw
 1package sqlite
 2
 3import (
 4	"database/sql"
 5	"embed"
 6
 7	_ "github.com/mattn/go-sqlite3"
 8)
 9
10//go:embed migrations/*.sql
11var migrationsFS embed.FS
12
13func Open(dbPath string) (*sql.DB, error) {
14	db, err := sql.Open("sqlite3", dbPath+"?_pragma=foreign_keys(1)&_pragma=busy_timeout(5000)")
15	if err != nil {
16		return nil, err
17	}
18	if err := db.Ping(); err != nil {
19		return nil, err
20	}
21	if err := migrate(db); err != nil {
22		return nil, err
23	}
24	return db, nil
25}
26
27func migrate(db *sql.DB) error {
28	migrations, err := migrationsFS.ReadDir("migrations")
29	if err != nil {
30		return err
31	}
32	for _, migration := range migrations {
33		if migration.IsDir() {
34			continue
35		}
36		content, err := migrationsFS.ReadFile("migrations/" + migration.Name())
37		if err != nil {
38			return err
39		}
40		if _, err := db.Exec(string(content)); err != nil {
41			return err
42		}
43	}
44	return nil
45}