ikurotime / gitgud

public
Fix migration embedding and make schema idempotent
DDavid committed on 2026-06-28 00:45 commit c06e0f6
internal/infra/persistence/sqlite/db.go +11 −10
package sqlite
import (
"database/sql"
"embed"
_ "github.com/mattn/go-sqlite3"
)
+//go:embed migrations/*.sql
var migrationsFS embed.FS
func Open(dbPath string) (*sql.DB, error) {
db, err := sql.Open("sqlite3", dbPath+"?_pragma=foreign_keys(1)&_pragma=busy_timeout(5000)")
if err != nil {
return nil, err
}
if err := db.Ping(); err != nil {
return nil, err
}
if err := migrate(db); err != nil {
return nil, err
}
return db, nil
}
func migrate(db *sql.DB) error {
- migrations, err := migrationsFS.ReadDir(".")
+ migrations, err := migrationsFS.ReadDir("migrations")
if err != nil {
return err
}
for _, migration := range migrations {
- if !migration.IsDir() {
- content, err := migrationsFS.ReadFile(migration.Name())
- if err != nil {
- return err
- }
- _, err = db.Exec(string(content))
- if err != nil {
- return err
- }
+ if migration.IsDir() {
+ continue
+ }
+ content, err := migrationsFS.ReadFile("migrations/" + migration.Name())
+ if err != nil {
+ return err
+ }
+ if _, err := db.Exec(string(content)); err != nil {
+ return err
}
}
return nil
}
internal/infra/persistence/sqlite/migrations/0001_init.sql +9 −9
-CREATE TABLE users (
+CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT NOT NULL,
password_hash TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-CREATE TABLE repositories (
+CREATE TABLE IF NOT EXISTS repositories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
owner_id INTEGER NOT NULL REFERENCES users(id),
name TEXT NOT NULL,
description TEXT NOT NULL DEFAULT '',
is_private INTEGER NOT NULL DEFAULT 0,
default_branch TEXT NOT NULL DEFAULT 'main',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE(owner_id, name)
);
-CREATE TABLE issues (
+CREATE TABLE IF NOT EXISTS issues (
id INTEGER PRIMARY KEY AUTOINCREMENT,
repo_id INTEGER NOT NULL REFERENCES repositories(id),
- number INTEGER NOT NULL, -- per-repo sequential (#1, #2 …)
+ number INTEGER NOT NULL,
author_id INTEGER NOT NULL REFERENCES users(id),
title TEXT NOT NULL,
body TEXT NOT NULL DEFAULT '',
- state TEXT NOT NULL DEFAULT 'open', -- 'open' | 'closed'
+ state TEXT NOT NULL DEFAULT 'open',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE(repo_id, number)
);
-CREATE TABLE issue_comments (
+CREATE TABLE IF NOT EXISTS issue_comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
issue_id INTEGER NOT NULL REFERENCES issues(id),
author_id INTEGER NOT NULL REFERENCES users(id),
body TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-CREATE TABLE pull_requests (
+CREATE TABLE IF NOT EXISTS pull_requests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
repo_id INTEGER NOT NULL REFERENCES repositories(id),
number INTEGER NOT NULL,
author_id INTEGER NOT NULL REFERENCES users(id),
title TEXT NOT NULL,
body TEXT NOT NULL DEFAULT '',
base_branch TEXT NOT NULL,
head_branch TEXT NOT NULL,
- state TEXT NOT NULL DEFAULT 'open', -- 'open' | 'merged' | 'closed'
+ state TEXT NOT NULL DEFAULT 'open',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE(repo_id, number)
);
-CREATE TABLE pr_comments (
+CREATE TABLE IF NOT EXISTS pr_comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pr_id INTEGER NOT NULL REFERENCES pull_requests(id),
author_id INTEGER NOT NULL REFERENCES users(id),
body TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);