Skip to main content

Known Limitations

This page is intentionally direct. Queen should be pleasant to use, but migration tools also need clear edges.

Current driver limits

AreaCurrent behaviorWhat to do
PostgreSQLReference path; strongest locking and transaction semantics.Prefer it for production when you can.
MySQLUses GET_LOCK, but DDL rollback follows MySQL rules.Test rollback scripts on the same MySQL flavor/version you deploy.
SQLiteLocking is local and not a distributed deployment lock.Use for tests, local tools, and single-process applications.
ClickHouseLocking is best-effort and table based. ClickHouse has no PostgreSQL-like transaction model.Serialize deploys outside Queen.
CockroachDBSerializable conflicts can produce retryable 40001 errors.Wrap deploy commands in retry-aware automation.
MSSQLUses application locks, but DDL behavior follows SQL Server rules.Treat rollback testing as required before production use.

queen import

queen import currently imports goose SQL migrations. It reads files with goose Up and Down sections, writes Queen Go migrations, and now fails instead of overwriting existing generated files.

Known limits:

  • it does not import every goose feature;
  • it does not prove imported SQL is semantically correct;
  • it preserves versions, so odd historical naming stays odd;
  • imported migrations should be reviewed before merging.

Run import in dry-run mode first:

go run ./cmd/migrate import ./db/migrations --from goose --output migrations --dry-run

create and naming

create writes into migrations/ and supports:

go run ./cmd/migrate create create_users --type sql
go run ./cmd/migrate create backfill_profiles --type go

The command derives the next version from existing migration filenames and .queen.yaml naming config. Sequential and padded sequential naming are the practical paths today.

Current limitation: semver naming exists in the naming config, but create does not expose a manual --version flag yet. Create semver migrations by writing the file yourself or using a custom project template.

Go-function checksums

Queen cannot hash Go function source at runtime. A function migration should set ManualChecksum and bump it when the function behavior changes:

queen.M{
Version: "003",
Name: "normalize_emails",
ManualChecksum: "normalize-emails-v2",
UpFunc: func(ctx context.Context, tx *sql.Tx) error {
_, err := tx.ExecContext(ctx, `UPDATE users SET email = LOWER(TRIM(email))`)
return err
},
}

Rollback is explicit

Queen does not invent rollback SQL. A rollback command fails when a migration has no DownSQL or DownFunc.

That is intentional. Some production migrations are irreversible, and pretending otherwise is worse than making the limitation visible.

TUI scope

The TUI is an inspection and debugging surface. It is useful for local diagnosis, viewing status, reading plans, and watching tap events.

Do not make the TUI the main production deployment path. Use the CLI commands directly in CI/CD.