From 282d2ab3e0fb3a74f32160a231225773001acd14 Mon Sep 17 00:00:00 2001 From: grm Date: Mon, 14 Sep 2026 00:51:19 +0300 Subject: Drop the single-database split and re-baseline the control migrations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every deployment has been through the per-blog split, so the code that performed it (split.go, control migrations 00002–00007) is dead weight, and a fresh install replaying six migrations only to drop the tables again was silly. The control chain is now a single 00001_init.sql with the final users and blogs shape, matching the blog chain. Goose ignores versions recorded in the database that no longer exist in the source, but refuses a future migration numbered below the database's highest version. Databases that went through the split therefore need `DELETE FROM goose_db_version WHERE version_id > 1` once; README and AGENTS.md say so. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Sd8UPWrvyYCLj97JexNw3A --- internal/db/db.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) (limited to 'internal/db/db.go') diff --git a/internal/db/db.go b/internal/db/db.go index 601680d..0f66fcc 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -139,12 +139,7 @@ func (c *Cluster) CreateBlogDB(ctx context.Context, dbName string) error { return nil } -// execer is the pool or connection createDatabase runs on. -type execer interface { - Exec(ctx context.Context, sql string, args ...any) (pgconn.CommandTag, error) -} - -func createDatabase(ctx context.Context, db execer, dbName string) error { +func createDatabase(ctx context.Context, db *pgxpool.Pool, dbName string) error { _, err := db.Exec(ctx, `CREATE DATABASE `+pgx.Identifier{dbName}.Sanitize()) var pgErr *pgconn.PgError if errors.As(err, &pgErr) && pgErr.Code == "42P04" { // duplicate_database @@ -169,10 +164,9 @@ func (c *Cluster) DropBlogDB(ctx context.Context, dbName string) error { // ---- migrations ------------------------------------------------------------ -// MigrateControl applies the control database migrations, including the Go -// migration that moves content out into the blog databases. +// MigrateControl applies the control database migrations. func MigrateControl(ctx context.Context, controlURL string) error { - return migrate(ctx, controlURL, "migrations/control", goose.WithGoMigrations(splitMigration(controlURL))) + return migrate(ctx, controlURL, "migrations/control") } // MigrateBlog applies the blog schema migrations to one blog database. @@ -181,8 +175,8 @@ func MigrateBlog(ctx context.Context, blogURL string) error { } // migrate runs goose over database/sql. A Provider (rather than the package -// globals) keeps the two migration sets, and the Go migration, apart. -func migrate(ctx context.Context, dsn, dir string, opts ...goose.ProviderOption) error { +// globals) keeps the two migration sets apart. +func migrate(ctx context.Context, dsn, dir string) error { sqldb, err := sql.Open("pgx", dsn) if err != nil { return err @@ -192,7 +186,7 @@ func migrate(ctx context.Context, dsn, dir string, opts ...goose.ProviderOption) if err != nil { return err } - p, err := goose.NewProvider(goose.DialectPostgres, sqldb, fsys, opts...) + p, err := goose.NewProvider(goose.DialectPostgres, sqldb, fsys) if err != nil { return err } -- cgit v1.2.3