jchenry 9b998b7904 Refactor and improve code quality, fix security issues and documentation
Security Fixes:
- Add SQL injection protection in dialect.go using proper identifier quoting
- Implement quoteIdentifier() method to escape SQL identifiers safely
- Fix resource leak in dbVersion() by adding deferred rows.Close()
- Fix incorrect error handling in dbVersion() to properly propagate errors

Code Quality Improvements:
- Replace custom Error struct with idiomatic fmt.Errorf with %w verb
- Simplify error handling by replacing nested if-err-nil with early returns
- Remove named return values with implicit returns for clarity
- Update interface{} to any (Go 1.18+ style)
- Fix variable shadowing in Apply loop (use m.Description instead of migrations[i])

Test Improvements:
- Fix variable shadowing bug in createTestDB() that caused nil pointer panics
- Update SQL driver from github.com/mattn/go-sqlite3 to modernc.org/sqlite
- Fix driver name from "sqlite3" to "sqlite" for modernc.org/sqlite
- Add missing error check for r.Scan() in TestApply
- Make test error handling consistent by using t.Fatal() throughout
- Simplify test helper functions with early returns

Documentation Fixes:
- Fix README example to use 'Apply' field instead of incorrect 'F' field
- Update README example to match actual test code (sex instead of gender)
- Fix typos: "datbase" → "database", "datbases" → "databases"
- Improve README clarity with proper punctuation and formatting
- Update doc.go with correct spelling

Dependencies:
- Update go.mod to Go 1.25
- Switch to modernc.org/sqlite v1.44.0 (pure Go SQLite driver)
- Add all required indirect dependencies

All changes maintain backward compatibility and pass existing tests.
2026-01-18 01:34:09 -08:00
2026-01-18 01:12:36 -08:00
2026-01-18 01:12:36 -08:00

migrate

migrate is a package for SQL database migrations in the spirit of dbstore. It is intended to keep its footprint small, requiring only an additional table in the database. There is no rollback support as you should only ever roll forward. SQLite support is provided, support for other databases can be added by implementing the Dialect interface

Installation

go get git.sdf.org/jchenry/migrate

Usage

...
changes := []Change{
	{
		Description: "create people table",
		Apply: func(ctx Context) error {
			_, err := ctx.Exec(`
				CREATE TABLE people (
					given_name VARCHAR(20),
					surname VARCHAR(30),
					sex CHAR(1),
					age SMALLINT);
			`)
			return err
		},
	},
	{
		Description: "Insert a person into people",
		Apply: func(ctx Context) error {
			_, err := ctx.Exec(`INSERT INTO people VALUES('Henry','Colin','M', 42)`)
			return err
		},
	},
}

err := migrate.Apply(db, migrate.Sqlite3(), changes)
...

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

MIT

S
Description
a simple go library to do database migration
Readme MIT
59 KiB
Languages
Go 100%