Switch from Atlas to MigrationPilot
MigrationPilot covers 13 of the 17 PostgreSQL checks Atlas documents, and adds 99 more. Free and open source: Atlas's PostgreSQL analyzers need a Pro plan, and MigrationPilot never had a paid tier for its linting.
npx migrationpilot analyze migrations/Rule-by-Rule Mapping
Atlas documents 17 PostgreSQL checks, all but PG110 behind Atlas Pro. MigrationPilot matches 13 of them. The 4 it does not are listed too.
| Atlas Rule | MigrationPilot Rule | Auto-Fix |
|---|---|---|
| PG101 Creating an index non-concurrently | MP001 require-concurrent-index-creation | Yes |
| PG102 Dropping an index non-concurrently | MP009 require-drop-index-concurrently | Yes |
| PG103 CONCURRENTLY without txmode none | MP025 ban-concurrent-in-transaction | Yes |
| PG104 ADD PRIMARY KEY takes ACCESS EXCLUSIVE | No direct equivalent | — |
| PG105 ADD UNIQUE takes ACCESS EXCLUSIVE | MP027 disallowed-unique-constraint | — |
| PG110 Non-optimal column alignment | MP061 suboptimal-column-order | — |
| PG301 Column type change rewrites the table | MP007 no-column-type-change | — |
| PG302 Adding a column with a volatile default | MP003 volatile-default-table-rewrite | — |
| PG303 Making a nullable column NOT NULL | MP002 require-check-not-null-pattern | — |
| PG304 PRIMARY KEY on nullable columns forces a scan | No direct equivalent | — |
| PG305 CHECK constraint without NOT VALID | MP030 require-not-valid-check | Yes |
| PG306 Foreign key without NOT VALID | MP005 require-not-valid-foreign-key | Yes |
| PG307 Changing LOGGED / UNLOGGED | MP047 ban-set-logged-unlogged | — |
| PG308 Trigger on an existing table blocks writes | MP090 warn-trigger-on-hot-table | — |
| PG309 STORED generated column rewrites the table | MP062 ban-add-generated-stored-column | — |
| PG310 Identity column rewrites the table | No direct equivalent | — |
| PG311 Access method change rewrites the table | No direct equivalent | — |
99 Rules Atlas Doesn't Have
Set aside the 13 checks both tools make and 99 MigrationPilot rules have no Atlas counterpart. Some of them:
Require SET lock_timeout before DDL
Avoid multiple DDL statements in a single transaction
Renaming columns breaks application queries
ALTER TYPE ADD VALUE cannot run inside a transaction (PG < 12)
DROP COLUMN acquires ACCESS EXCLUSIVE lock
Require SET statement_timeout for long-running DDL
CASCADE silently drops dependent objects
CONCURRENTLY in a transaction causes runtime error
Use TEXT instead of VARCHAR(n) — same performance, no arbitrary limit
Detect type changes that may silently truncate data
DETACH PARTITION without CONCURRENTLY locks the parent table
pgvector: HNSW has better recall and no training requirement
DROP/ALTER COLUMN may break views, functions, or triggers
New enum value is not visible until COMMIT
Plus 85 more covering lock safety, data types, partitioning and pgvector indexes. See all 112 rules.
Feature Comparison
| Feature | Atlas (Free) | Atlas (Pro) | MigrationPilot |
|---|---|---|---|
| Migration linting | PG110 only | 16 PG checks | 112 rules (all free) |
| Auto-fix | — | — | 20 rules |
| GitHub Action | Limited | Yes | Free |
| PR inline annotations | — | Yes | Free |
| SARIF output | — | — | Free |
| Lock type analysis | — | — | Free |
| MCP Server (AI tools) | — | — | Free |
| Execution plan | — | — | Free |
| Schema drift detection | — | Yes | Free |
| Air-gapped mode | — | — | Free |
| Config presets | atlas.hcl | atlas.hcl | 5 YAML presets |
| Price | $0 | Custom | $0 (all 112 rules free) |
Migrate in 2 Minutes
Remove Atlas lint config
Delete the lint block from your atlas.hcl file. Keep Atlas for schema management if you want — MigrationPilot only handles linting.
Add MigrationPilot to CI
# .github/workflows/migration-lint.yml
name: Lint Migrations
on: pull_request
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: mickelsamuel/migrationpilot@v1
with:
path: migrations/Optional: Configure rules
# .migrationpilotrc.yml extends: recommended pgVersion: 16 exclude: - MP008 # Allow multi-DDL transactions
Free migration linting shouldn't require a paid plan
112 safety rules. 20 auto-fixes. GitHub Action with inline annotations. Open source, no signup, no paid tier for linting.