Skip to content
In this guide

Guide · Doing

Find drift between environments

Read this when the same database lives in several environments and you want to know whether production still matches what staging tested. The drift board reads the snapshots that schema history already took. It doesn't connect to anything to draw a row, so it never waits on a database and never touches production.

App groups

Drift compares connections that hold the same app. Seqora groups them for you inside a workspace: orders-local in Development, orders-staging in Staging and orders-prod in Production share the database name orders, so they form the app orders. When the names differ, as with orders_dev and orders, Seqora pairs them when their newest snapshots share at least 80% of their table names.

A group holds at most one connection per environment, and a workspace with one environment has no groups. To change a group:

  1. Right-click the workspace in the explorer and choose App groups….
  2. Rename a group, move a connection to another group, or pick Left out to keep a connection out of every group. Automatic puts it back.
  3. Click Save.

Renaming a group keeps the differences you accepted under it.

Open the board

  1. The workspace row in the explorer shows a warning icon and the number of drift rows across its groups.
  2. Right-click the workspace and choose Drift · orders, or run Schema drift from the command palette.

The board has one column per environment, in the order Development, Testing, Staging, Production. Each column shows the connection, its environment, the newest migration version and how old its snapshot is. An age over 7 days takes the warning colour. A connection Seqora has never captured reads Never captured, with Connect beside it. The header also says how many tables are identical everywhere, for example "26 tables identical".

Read the rows

Each row is one object that differs somewhere: customers.phone, payments_created_at_idx. Every cell holds that environment's value, or is hatched when the object is absent there. The cell that disagrees with the rest takes the warning colour, with the date it changed and its source from history. Index and constraint names that differ between environments don't count as differences.

The rows sit in three sections:

  • Drift: differences nothing explains. These are the ones to look at.
  • Expected: a migration staging has run and production hasn't yet, such as 0047_refunds, which the cell names, or a change only Development has that no migration made.
  • Accepted: differences you accepted. Collapsed.

When every environment matches, the board says so: "orders matches across local, staging and prod".

Act on a row

  1. Select a drift row.
  2. Compare staging → prod opens a compare between the two live connections, reading both fresh, so you get the script that makes the odd one match.
  3. Or click Accept when the difference is on purpose. The row moves to Accepted and stays there while every environment keeps the same value. If any of them changes, it comes back under Drift. Remove on an accepted row brings it back now.

Copy report copies the board as Markdown, for a ticket or a release note. Refresh connects to each environment in turn and checks it, so the board shows the schema as it is now. One that can't connect keeps its last snapshot and its age.

Caveats

  • The drift board is Pro. App groups, App groups… and the count on the workspace row are free.
  • The board is only as fresh as the snapshots. Use Refresh, or open a connection, before you trust an old column.
  • Drift compares one engine family. A group can't mix PostgreSQL with MySQL.
  • With no Production environment, the last environment in the order above is the reference.
  • On MySQL and MariaDB each connection's own database is compared, whatever its name.

Last checked against Seqora 0.4.6 development build, PostgreSQL 16 on .

Bugs and small complaints both go to this address. I read every email myself.