diesel-guard 0.10.0

Linter for dangerous Postgres migration patterns in Diesel and SQLx. Prevents downtime caused by unsafe schema changes.
Documentation
# Checks

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

| Check | Operation | Lock Type |
|---|---|---|
| [Add Check Constraint]add-check-constraint.md | `ALTER TABLE ... ADD CONSTRAINT ... CHECK` without `NOT VALID` | ACCESS EXCLUSIVE |
| [ADD COLUMN with DEFAULT]add-column-default.md | `ALTER TABLE ... ADD COLUMN ... DEFAULT` | ACCESS EXCLUSIVE + table rewrite |
| [Adding an EXCLUDE Constraint]add-exclude-constraint.md | `ALTER TABLE ... ADD CONSTRAINT ... EXCLUDE` | SHARE ROW EXCLUSIVE + full table scan |
| [Add Foreign Key]add_foreign_key.md | `ALTER TABLE ... ADD FOREIGN KEY` without `NOT VALID` | ShareRowExclusiveLock |
| [Adding an Index]adding-index.md | `CREATE INDEX` without `CONCURRENTLY`; `CREATE INDEX CONCURRENTLY` inside a transaction | SHARE |
| [Adding a UNIQUE Constraint]adding-unique-constraint.md | `ALTER TABLE ... ADD UNIQUE` | ACCESS EXCLUSIVE |
| [Changing Column Type]changing-column-type.md | `ALTER TABLE ... ALTER COLUMN ... TYPE` | ACCESS EXCLUSIVE + table rewrite |
| [CHAR Fields]char-field.md | `CHAR`/`CHARACTER` column types | — (best practice) |
| [Create Table with SERIAL]create-table-serial.md | `SERIAL/BIGSERIAL/SMALLSERIAL` in `CREATE TABLE` | — (best practice) |
| [Creating an Extension]creating-extension.md | `CREATE EXTENSION` | — (requires superuser) |
| [Domain CHECK Constraint]add-domain-check-constraint.md | `ALTER DOMAIN ... ADD CONSTRAINT ... CHECK` without `NOT VALID` | ACCESS EXCLUSIVE |
| [Dropping a Column]dropping-column.md | `ALTER TABLE ... DROP COLUMN` | ACCESS EXCLUSIVE |
| [Dropping a Constraint]dropping-constraint.md | Unnamed `UNIQUE`/`FOREIGN KEY`/`CHECK` constraints | — (best practice) |
| [Dropping a Database]dropping-database.md | `DROP DATABASE` | Exclusive access |
| [Dropping an Index]dropping-index.md | `DROP INDEX` without `CONCURRENTLY`; `DROP INDEX CONCURRENTLY` inside a transaction | ACCESS EXCLUSIVE |
| [Dropping a Primary Key]dropping-primary-key.md | `ALTER TABLE ... DROP CONSTRAINT ... pkey` | ACCESS EXCLUSIVE |
| [Dropping a Table]dropping-table.md | `DROP TABLE` | ACCESS EXCLUSIVE |
| [Generated Columns]generated-column.md | `ADD COLUMN ... GENERATED ALWAYS AS ... STORED` | ACCESS EXCLUSIVE + table rewrite |
| [JSON Fields]json-field.md | `ADD COLUMN ... JSON` | — (best practice) |
| [Mutation without WHERE]mutation-without-where.md | `DELETE FROM table` or `UPDATE table SET ...` without `WHERE` | ACCESS EXCLUSIVE / ROW EXCLUSIVE |
| [Wide Indexes]multiple-column-index.md | `CREATE INDEX` with 4+ columns | — (best practice) |
| [REFRESH MATERIALIZED VIEW]refresh-materialized-view.md | `REFRESH MATERIALIZED VIEW` without `CONCURRENTLY`; `REFRESH MATERIALIZED VIEW CONCURRENTLY` inside a transaction | ACCESS EXCLUSIVE |
| [Renaming a Column]renaming-column.md | `ALTER TABLE ... RENAME COLUMN` | ACCESS EXCLUSIVE |
| [Renaming a Schema]renaming-schema.md | `ALTER SCHEMA ... RENAME TO` | ACCESS EXCLUSIVE |
| [Renaming a Table]renaming-table.md | `ALTER TABLE ... RENAME TO` | ACCESS EXCLUSIVE |
| [REINDEX]reindexing.md | `REINDEX` without `CONCURRENTLY`; `REINDEX CONCURRENTLY` inside a transaction | ACCESS EXCLUSIVE |
| [SERIAL Primary Keys]serial-primary-key.md | `ADD COLUMN ... SERIAL/BIGSERIAL` | ACCESS EXCLUSIVE + table rewrite |
| [SET NOT NULL]set-not-null.md | `ALTER TABLE ... ALTER COLUMN ... SET NOT NULL` | ACCESS EXCLUSIVE |
| [Short Primary Keys]short-primary-key.md | `SMALLINT`/`INT` primary keys | — (best practice) |
| [TIMESTAMP Fields]timestamp-field.md | `TIMESTAMP` without time zone | — (best practice) |
| [TRUNCATE TABLE]truncating-table.md | `TRUNCATE TABLE` | ACCESS EXCLUSIVE |
| [Unnamed Constraints]unnamed-constraint.md | Constraints without explicit names | — (best practice) |

Need project-specific rules beyond these? See [Custom Checks](../custom-checks.md).