Files
go_sql_schema_migrate/README.md
2026-05-31 16:27:32 +02:00

1.9 KiB

go-migrate

A PostgreSQL schema migration tool that generates and applies migrations by comparing your desired schema (SQL files) with the current database state.

Features

  • Schema comparison: Compare your desired schema against the live database
  • Migration generation: Automatically generate SQL migration statements
  • Migration application: Apply migrations directly to the database
  • Type support: Handles tables, columns, indexes, foreign keys, enums, and constraints

Installation

As a Library

go get git.petrovv.com/go-migrate

CLI Tool

go install git.petrovv.com/go-migrate/cmd/go-migrate@latest

Usage

Library

import "git.petrovv.com/go-migrate"

ctx := context.Background()
db, _ := pgxpool.New(ctx, "postgres://user:pass@localhost:5432/db")

// Generate migrations
migrations, err := migrate.GetMigrations(ctx, db, "schema/")
for _, m := range migrations {
    fmt.Println(m)
}

// Or use LoadDesiredSchema and CompareSchemas for more control
desired, _ := migrate.LoadDesiredSchema("schema/")
current, _ := migrate.GetCurrentSchema(ctx, db)
migrations = migrate.CompareSchemas(current, desired)

CLI

# Generate migration SQL
go-migrate -cmd=generate -dir=schema

# Apply migrations
go-migrate -cmd=apply -dir=schema

Flags:

  • -dir: Directory containing schema SQL files (default: schema)
  • -cmd: generate or apply

Schema Files

Place your desired schema SQL files in a directory (e.g., schema/). Files are loaded alphabetically.

Example schema/01_users.sql:

CREATE TABLE users (
    id BIGSERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT NOT NULL UNIQUE
);

CREATE INDEX idx_users_name ON users (name);

Environment Variables

For the CLI, database connection can be configured via environment variables or .env file:

DB_USER=postgres
DB_PASS=password
DB_HOST=localhost
DB_PORT=5432
DB_NAME=mydb