Goose Versions Save

A database migration tool. Supports SQL migrations and Go functions.

v3.20.0

2 weeks ago

What's Changed

  • Expand the Store interface by adding a GetLatestVersion method and make the interface public.
  • Add a (non-blocking) method to check if there are pending migrations to the goose.Provider (#751):
func (p *Provider) HasPending(context.Context) (bool, error) {}

[!NOTE]
The underlying implementation does not respect the SessionLocker (if one is enabled) and can be used to check for pending migrations without blocking or being blocked by other operations.

  • The methods .Up, .UpByOne, and .UpTo from goose.Provider will invoke .HasPending before acquiring a lock with SessionLocker (if enabled). This addresses an edge case in Kubernetes-style deployments where newer pods with long-running migrations prevent older pods - which have all known migrations applied - from starting up due to an advisory lock. For more details, refer to https://github.com/pressly/goose/pull/507#discussion_r1266498077 and #751.
  • Move integration tests to ./internal/testing and make it a separate Go module. This will allow us to have a cleaner top-level go.mod file and avoid imports unrelated to the goose project. See integration/README.md for more details. This shouldn't affect users of the goose library.

v3.19.2

1 month ago
  • Remove duckdb support. The driver uses Cgo and we've decided to remove it until we can find a better solution. If you were using duckdb with goose, please let us know by opening an issue.

v3.19.1

1 month ago
  • Fix selecting dialect for redshift
  • Add GOOSE_MIGRATION_DIR documentation
  • Bump github.com/opencontainers/runc to v1.1.12 (security fix)
  • Update CI tests for go1.22
  • Make goose annotations case-insensitive
    • All -- +goose annotations are now case-insensitive. This means that -- +goose Up and -- +goose up are now equivalent. This change was made to improve the user experience and to make the annotations more consistent.

New Contributors

v3.18.0

3 months ago

⚠️ Note, starting with goose v3.18.0 (current release) the minimum supported Go version is go1.20

New features

  • Add environment variable substitution for SQL migrations. (#604)

    • This feature is disabled by default, and can be enabled by adding an annotation to the migration file:

      -- +goose ENVSUB ON
      
    • When enabled, goose will attempt to substitute environment variables in the SQL migration queries until the end of the file, or until the annotation -- +goose ENVSUB OFF is found. For example, if the environment variable REGION is set to us_east_1, the following SQL migration will be substituted to SELECT * FROM regions WHERE name = 'us_east_1';

      -- +goose ENVSUB ON
      -- +goose Up
      SELECT * FROM regions WHERE name = '${REGION}';
      
    • This feature intentionally supports a minimal expansion set; see Supported Expansions in the https://github.com/mfridman/interpolate repository (forked from https://github.com/buildkite/interpolate)

  • Add native Turso support with libsql driver. (#658)

Fixes

  • Fixed query for list migrations in YDB (#684)

v3.17.0

4 months ago
  • Standardised the MIT license (#647)
  • Improve provider Apply() errors, add ErrNotApplied when attempting to rollback a migration that has not been previously applied. (#660)
  • Add WithDisableGlobalRegistry option to NewProvider to disable the global registry. (#645)
  • Add -timeout flag to CLI to set the maximum allowed duration for queries to run. Default remains no timeout. (#627)
  • Add optional logging in Provider when WithVerbose option is supplied. (#668)

⚠️ Potential Breaking Change ⚠️

  • Update goose create to use UTC time instead of local time. (#242)

v3.16.0

5 months ago
  • Added YDB support. (#592)
  • Fix sqlserver query to ensure DB version. (#601)
  • Allow setting / resetting the global Go migration registry. (#602)
    • SetGlobalMigrations and ResetGlobalMigrations functions have been added.
    • Introduce NewGoMigration for constructing Go migrations.
  • Add initial implementation of goose.NewProvider.

🎉 Read more about this new feature here:

https://pressly.github.io/goose/blog/2023/goose-provider/

The motivation behind the Provider was simple - to reduce global state and make goose easier to consume as an imported package.

Here's a quick summary:

  • Avoid global state
  • Make Provider safe to use concurrently
  • Unlock (no pun intended) new features, such as database locking
  • Make logging configurable
  • Better error handling with proper return values
  • Double down on Go migrations
  • ... and more!

v3.15.1

6 months ago
  • Fix regression that prevented registering Go migrations that didn't have the corresponding files available in the filesystem. (#588)
    • If Go migrations have been registered globally, but there are no .go files in the filesystem, always include them.
    • If Go migrations have been registered, and there are .go files in the filesystem, only include those migrations. This was the original motivation behind #553.
    • If there are .go files in the filesystem but not registered, raise an error. This is to prevent accidentally adding valid looking Go migration files without explicitly registering them.

v3.15.0

8 months ago
  • Fix sqlparser to avoid skipping the last statement when it's not terminated with a semicolon within a StatementBegin/End block. (#580)
  • Add go1.21 to the CI matrix.
  • Bump minimum version of module in go.mod to go1.19.
  • Fix version output when installing pre-built binaries (#585).

v3.14.0

9 months ago
  • Filter registered Go migrations from the global map with corresponding .go files from the filesystem.
    • The code previously assumed all .go migrations would be in the same folder, so this should not be a breaking change.
    • See #553 for more details
  • Improve output log message for applied up migrations. #562
  • Fix an issue where AddMigrationNoTxContext was registering the wrong source because it skipped too many frames. #572
  • Improve binary version output when using go install.

v3.13.4

10 months ago
  • Fix pre-built binary versioning and make small improvements to GoReleaser config (a tool for packaging / releasing Go tools).
  • Fix an edge case in the sqlparser where the last up statement may be ignored if it's unterminated with a semicolon and followed by a -- +goose Down annotation.
  • Trim Logger interface to Printf and Fatalf methods only. Projects that have previously implemented the Logger interface should not be affected, and can remove unused methods.