Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Checks

diesel-guard ships safety checks covering the most common Postgres migration hazards.

CheckOperationLock Type
Add Check ConstraintALTER TABLE ... ADD CONSTRAINT ... CHECK without NOT VALIDACCESS EXCLUSIVE
Add Primary KeyALTER TABLE ... ADD PRIMARY KEYACCESS EXCLUSIVE
ADD COLUMN with DEFAULTALTER TABLE ... ADD COLUMN ... DEFAULTACCESS EXCLUSIVE + table rewrite
Adding an EXCLUDE ConstraintALTER TABLE ... ADD CONSTRAINT ... EXCLUDESHARE ROW EXCLUSIVE + full table scan
Add Foreign KeyALTER TABLE ... ADD FOREIGN KEY without NOT VALIDShareRowExclusiveLock
Adding an IndexCREATE INDEX without CONCURRENTLY; CREATE INDEX CONCURRENTLY inside a transactionSHARE
Adding a UNIQUE ConstraintALTER TABLE ... ADD UNIQUEACCESS EXCLUSIVE
Alter Column TypeALTER TABLE ... ALTER COLUMN ... TYPEACCESS EXCLUSIVE + table rewrite
CHAR TypeCHAR/CHARACTER column types— (best practice)
Create Table with SERIALSERIAL/BIGSERIAL/SMALLSERIAL in CREATE TABLE— (best practice)
Create ExtensionCREATE EXTENSION— (requires superuser)
Domain CHECK ConstraintALTER DOMAIN ... ADD CONSTRAINT ... CHECK without NOT VALIDACCESS EXCLUSIVE
Drop ColumnALTER TABLE ... DROP COLUMNACCESS EXCLUSIVE
Drop ConstraintUnnamed UNIQUE/FOREIGN KEY/CHECK constraints— (best practice)
Drop DatabaseDROP DATABASEExclusive access
Drop IndexDROP INDEX without CONCURRENTLY; DROP INDEX CONCURRENTLY inside a transactionACCESS EXCLUSIVE
Drop Primary KeyALTER TABLE ... DROP CONSTRAINT ... pkeyACCESS EXCLUSIVE
Drop TableDROP TABLEACCESS EXCLUSIVE
Generated ColumnsADD COLUMN ... GENERATED ALWAYS AS ... STOREDACCESS EXCLUSIVE + table rewrite
Idempotency GuardsMissing IF [NOT] EXISTS guards on retry-sensitive DDL— (retry safety)
Add JSON ColumnADD COLUMN ... JSON— (best practice)
Mutation without WHEREDELETE FROM table or UPDATE table SET ... without WHEREACCESS EXCLUSIVE / ROW EXCLUSIVE
Wide IndexesCREATE INDEX with 4+ columns— (best practice)
REFRESH MATERIALIZED VIEWREFRESH MATERIALIZED VIEW without CONCURRENTLY; REFRESH MATERIALIZED VIEW CONCURRENTLY inside a transactionACCESS EXCLUSIVE
Rename ColumnALTER TABLE ... RENAME COLUMNACCESS EXCLUSIVE
Rename SchemaALTER SCHEMA ... RENAME TOACCESS EXCLUSIVE
Rename TableALTER TABLE ... RENAME TOACCESS EXCLUSIVE
REINDEXREINDEX without CONCURRENTLY; REINDEX CONCURRENTLY inside a transactionACCESS EXCLUSIVE
Add Serial ColumnADD COLUMN ... SERIAL/BIGSERIALACCESS EXCLUSIVE + table rewrite
SET NOT NULLALTER TABLE ... ALTER COLUMN ... SET NOT NULLACCESS EXCLUSIVE
Short Primary KeysSMALLINT/INT primary keys— (best practice)
TIMESTAMP TypeTIMESTAMP without time zone— (best practice)
Truncate TableTRUNCATE TABLEACCESS EXCLUSIVE
Unnamed ConstraintsConstraints without explicit names— (best practice)

Need project-specific rules beyond these? See Custom Checks.