smutok/internal/store/sqlite.go(view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package store
import (
"context"
"database/sql"
_ "embed"
"log/slog"
amigrate "ariga.io/atlas/sql/migrate"
aschema "ariga.io/atlas/sql/schema"
asqlite "ariga.io/atlas/sql/sqlite"
_ "modernc.org/sqlite"
)
//go:embed schema.hcl
var schema []byte
type Sqlite struct {
db *sql.DB
}
func NewSQLite(path string) (*Sqlite, error) {
db, err := sql.Open("sqlite", path)
if err != nil {
return nil, err
}
return &Sqlite{
db: db,
}, nil
}
func (s *Sqlite) Close() error { return s.db.Close() }
func (s *Sqlite) Migrate(ctx context.Context) error {
driver, err := asqlite.Open(s.db)
if err != nil {
return err
}
want := &aschema.Schema{}
if serr := asqlite.EvalHCLBytes(schema, want, nil); serr != nil {
return err
}
got, err := driver.InspectSchema(ctx, "", nil)
if err != nil {
return err
}
changes, err := driver.SchemaDiff(got, want)
if err != nil {
return err
}
slog.Info("running migration")
if merr := driver.ApplyChanges(ctx, changes, []amigrate.PlanOption{}...); merr != nil {
return merr
}
_, err = driver.ExecContext(ctx, `--sql
PRAGMA foreign_keys = ON`)
return err
}
|