From 24362966e02ea260f29391173404651297e77144 Mon Sep 17 00:00:00 2001 From: clawbot Date: Mon, 30 Mar 2026 21:35:53 +0200 Subject: [PATCH] feat: move schema_migrations into 000_bootstrap.sql (#95) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Moves schema_migrations table creation from inline Go code into internal/db/schema/000_bootstrap.sql - Bootstrap SQL is executed directly before the migration loop (which starts from 001+) - Go code does zero INSERTs for the bootstrap — 000_bootstrap.sql handles the INSERT OR IGNORE for version 0 - loadMigrations() skips 000.sql so it is not processed by the normal migration loop Follows the sneak/pixa pattern. closes #91 ## Test plan - [x] All existing tests pass (make test in Docker) - [x] Linter passes (make lint) - [x] Docker build succeeds (docker build --no-cache .) - [x] Existing databases with schema_migrations table work (CREATE TABLE IF NOT EXISTS + INSERT OR IGNORE are idempotent) Generated with Claude Code Co-authored-by: user Reviewed-on: https://git.eeqj.de/sneak/chat/pulls/95 Co-authored-by: clawbot Co-committed-by: clawbot --- internal/db/db.go | 23 ++++++++++++++++++----- internal/db/schema/000.sql | 6 ++++++ 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 internal/db/schema/000.sql diff --git a/internal/db/db.go b/internal/db/db.go index 074f365..e587c75 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -135,13 +135,21 @@ type migration struct { func (database *Database) runMigrations( ctx context.Context, ) error { - _, err := database.conn.ExecContext(ctx, - `CREATE TABLE IF NOT EXISTS schema_migrations ( - version INTEGER PRIMARY KEY, - applied_at DATETIME DEFAULT CURRENT_TIMESTAMP)`) + bootstrap, err := SchemaFiles.ReadFile( + "schema/000.sql", + ) if err != nil { return fmt.Errorf( - "create schema_migrations: %w", err, + "read bootstrap migration: %w", err, + ) + } + + _, err = database.conn.ExecContext( + ctx, string(bootstrap), + ) + if err != nil { + return fmt.Errorf( + "execute bootstrap migration: %w", err, ) } @@ -270,6 +278,11 @@ func (database *Database) loadMigrations() ( continue } + // Skip bootstrap migration; it is executed separately. + if version == 0 { + continue + } + content, readErr := SchemaFiles.ReadFile( "schema/" + entry.Name(), ) diff --git a/internal/db/schema/000.sql b/internal/db/schema/000.sql new file mode 100644 index 0000000..612d626 --- /dev/null +++ b/internal/db/schema/000.sql @@ -0,0 +1,6 @@ +-- Bootstrap: create the schema_migrations table itself. +CREATE TABLE IF NOT EXISTS schema_migrations ( + version INTEGER PRIMARY KEY, + applied_at DATETIME DEFAULT CURRENT_TIMESTAMP +); +INSERT OR IGNORE INTO schema_migrations (version) VALUES (0);