Skip to main content

squawk npm

Linter for Postgres migrations & SQL

Quick Start | Playground | Rules Documentation | GitHub Action | DIY GitHub Integration

Why?

Prevent unexpected downtime caused by database migrations and encourage best practices around Postgres schemas and SQL.

Install

npm install -g squawk-cli

# or via PYPI
pip install squawk-cli

# or install binaries directly via the releases page
https://github.com/sbdchd/squawk/releases

Or via Docker

You can also run Squawk using Docker. The official image is available on GitHub Container Registry.

# Assuming you want to check sql files in the current directory
docker run --rm -v $(pwd):/data ghcr.io/sbdchd/squawk:latest *.sql

Or via the Playground

Use the WASM powered playground to check your SQL locally in the browser!

https://play.squawkhq.com

Or via VSCode

https://marketplace.visualstudio.com/items?itemName=sbdchd.squawk

Usage

❯ squawk example.sql
warning[prefer-bigint-over-int]: Using 32-bit integer fields can result in hitting the max `int` limit.
  ╭▸ example.sql:6:10
  │
6 │     "id" serial NOT NULL PRIMARY KEY,
  │          ━━━━━━
  │
  ├ help: Use 64-bit integer values instead to prevent hitting this limit.
  ╭╴
6 │     "id" bigserial NOT NULL PRIMARY KEY,
  ╰╴         +++
warning[prefer-identity]: Serial types make schema, dependency, and permission management difficult.
  ╭▸ example.sql:6:10
  │
6 │     "id" serial NOT NULL PRIMARY KEY,
  │          ━━━━━━
  │
  ├ help: Use an `IDENTITY` column instead.
  ╭╴
6 -     "id" serial NOT NULL PRIMARY KEY,
6 +     "id" integer generated by default as identity NOT NULL PRIMARY KEY,
  ╰╴
warning[prefer-text-field]: Changing the size of a `varchar` field requires an `ACCESS EXCLUSIVE` lock, that will prevent all reads and writes to the table.
  ╭▸ example.sql:7:13
  │
7 │     "alpha" varchar(100) NOT NULL
  │             ━━━━━━━━━━━━
  │
  ├ help: Use a `TEXT` field with a `CHECK` constraint.
  ╭╴
7 -     "alpha" varchar(100) NOT NULL
7 +     "alpha" text NOT NULL
  ╰╴
warning[require-concurrent-index-creation]: During normal index creation, table updates are blocked, but reads are still allowed.
   ╭▸ example.sql:10:1
   │
10 │ CREATE INDEX "field_name_idx" ON "table_name" ("field_name");
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   │
   ├ help: Use `concurrently` to avoid blocking writes.
   ╭╴
10 │ CREATE INDEX concurrently "field_name_idx" ON "table_name" ("field_name");
   ╰╴             ++++++++++++
warning[constraint-missing-not-valid]: By default new constraints require a table scan and block writes to the table while that scan occurs.
   ╭▸ example.sql:12:24
   │
12 │ ALTER TABLE table_name ADD CONSTRAINT field_name_constraint UNIQUE (field_name);
   │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   │
   ╰ help: Use `NOT VALID` with a later `VALIDATE CONSTRAINT` call.
warning[disallowed-unique-constraint]: Adding a `UNIQUE` constraint requires an `ACCESS EXCLUSIVE` lock which blocks reads and writes to the table while the index is built.
   ╭▸ example.sql:12:28
   │
12 │ ALTER TABLE table_name ADD CONSTRAINT field_name_constraint UNIQUE (field_name);
   │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   │
   ╰ help: Create an index `CONCURRENTLY` and create the constraint using the index.

Find detailed examples and solutions for each rule at https://squawkhq.com/docs/rules
Found 6 issues in 1 file (checked 1 source file)

squawk --help

Find problems in your SQL

Usage: squawk [OPTIONS] [path]... [COMMAND]

Commands:
  server            Run the language server
  upload-to-github  Comment on a PR with Squawk's results
  help              Print this message or the help of the given subcommand(s)

Arguments:
  [path]...
          Paths or patterns to search

Options:
      --exclude-path <EXCLUDED_PATH>
          Paths to exclude

          For example:

          `--exclude-path=005_user_ids.sql --exclude-path=009_account_emails.sql`

          `--exclude-path='*user_ids.sql'`

  -e, --exclude <rule>
          Exclude specific warnings

          For example: --exclude=require-concurrent-index-creation,ban-drop-database

  -i, --include <rule>
          Include opt-in rules that are disabled by default

          Rules listed in --exclude take precedence over --include.

          For example: --include=require-table-schema

      --pg-version <PG_VERSION>
          Specify postgres version

          For example: --pg-version=13.0

      --debug <format>
          Output debug format

          [possible values: lex, parse, ast]

      --reporter <REPORTER>
          Style of error reporting

          [possible values: tty, gcc, json, gitlab]

      --stdin-filepath <filepath>
          Path to use in reporting for stdin

      --verbose
          Enable debug logging output

  -c, --config <CONFIG_PATH>
          Path to the squawk config file (.squawk.toml)

      --assume-in-transaction
          Assume that a transaction will wrap each SQL file when run by a migration tool

          Use --no-assume-in-transaction to override any config file that sets this

      --no-error-on-unmatched-pattern
          Do not exit with an error when provided path patterns do not match any files

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

Rules

Individual rules can be disabled via the --exclude flag

squawk --exclude=adding-field-with-default,disallowed-unique-constraint example.sql

Disabling rules via comments

Rule violations can be ignored via the squawk-ignore comment:

-- squawk-ignore ban-drop-column
alter table t drop column c cascade;

You can also ignore multiple rules by making a comma seperated list:

-- squawk-ignore ban-drop-column, renaming-column,ban-drop-database
alter table t drop column c cascade;

To ignore a rule for the entire file, use squawk-ignore-file:

-- squawk-ignore-file ban-drop-column
alter table t drop column c cascade;
-- also ignored!
alter table t drop column d cascade;

Or leave off the rule names to ignore all rules for the file

-- squawk-ignore-file
alter table t drop column c cascade;
create table t (a int);

Configuration file

Rules can also be disabled with a configuration file.

By default, Squawk will traverse up from the current directory to find a .squawk.toml configuration file. You may specify a custom path with the -c or --config flag.

squawk --config=~/.squawk.toml example.sql

The --exclude flag will always be prioritized over the configuration file.

Example .squawk.toml

excluded_rules = [
    "require-concurrent-index-creation",
    "require-concurrent-index-deletion",
]

See the Squawk website for documentation on each rule with examples and reasoning.

Bot Setup

Squawk works as a CLI tool but can also create comments on GitHub Pull Requests using the upload-to-github subcommand.

Here's an example comment created by squawk using the example.sql in the repo:

https://github.com/sbdchd/squawk/pull/14#issuecomment-647009446

See the "GitHub Integration" docs for more information.

pre-commit hook

Integrate Squawk into Git workflow with pre-commit. Add the following to your project's .pre-commit-config.yaml:

repos:
  - repo: https://github.com/sbdchd/squawk
    rev: v2.68.0
    hooks:
      - id: squawk
        files: path/to/postgres/migrations/written/in/sql

Note the files parameter as it specifies the location of the files to be linted.

Dev

cargo install
cargo run
./s/test
./s/lint
./s/fmt

... or with nix:

$ nix develop
[nix-shell]$ cargo run
[nix-shell]$ cargo insta review
[nix-shell]$ ./s/test
[nix-shell]$ ./s/lint
[nix-shell]$ ./s/fmt

Adding a New Rule

When adding a new rule, running cargo xtask new-rule will create stubs for your rule in the Rust crate and in Documentation site.

cargo xtask new-rule 'prefer big serial'

Releasing a New Version

  1. Run s/update-version

    # update version in squawk/Cargo.toml, package.json, flake.nix to 4.5.3
    s/update-version 4.5.3
    
  2. Update the CHANGELOG.md

    Include a description of any fixes / additions. Make sure to include the PR numbers and credit the authors.

  3. Create a new release on GitHub

    Use the text and version from the CHANGELOG.md

Algolia

The squawkhq.com Algolia index can be found on the crawler website. Algolia reindexes the site every day at 5:30 (UTC).

How it Works

Squawk uses its parser (based on rust-analyzer's parser) to create a CST. The linters then use an AST layered on top of the CST to navigate and record warnings, which are then pretty printed!

Metadata

Release files for squawk-cli 2.68.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for squawk-cli 2.68.0
File Size Uploaded
squawk_cli-2.68.0.tar.gz 1.5 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for squawk-cli 2.68.0
File
squawk_cli-2.68.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
squawk_cli-2.68.0-py3-none-win32.whl Python 3 none Windows x86-32 Details
squawk_cli-2.68.0-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
squawk_cli-2.68.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
squawk_cli-2.68.0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
squawk_cli-2.68.0-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 38.9 MB

Release files / squawk_cli-2.68.0.tar.gz

Download URL squawk_cli-2.68.0.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
7ec7c5f9858b7ee389b71e7d542f2b3dddd9e00fc06abf0b76efd671be2a7b14
BLAKE2b-256 checksum
How to use checksums
b83efe5f813fc2233f4c960d6a7ba41c6bd0d897c2c3a3991eabafcb3f465bbe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via maturin/1.15.0

Release files / squawk_cli-2.68.0-py3-none-win_amd64.whl

Download URL squawk_cli-2.68.0-py3-none-win_amd64.whl
Size 5.6 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
8f8b4e08a59856fd72ba14bb83845419a2af1d4000097e44a08fd00055a92d44
BLAKE2b-256 checksum
How to use checksums
1ef3dc9fa5766b97c0961be9b6828c75aaca8df94ea1e74af707f7856eb95a23
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via maturin/1.15.0

Release files / squawk_cli-2.68.0-py3-none-win32.whl

Download URL squawk_cli-2.68.0-py3-none-win32.whl
Size 4.9 MB
Tags Python 3 Windows x86-32
SHA-256 checksum
How to use checksums
8364b0e6d06b554392fc06f8e2cac3e170847f7b8e7fc2da5e0df8ab6410b980
BLAKE2b-256 checksum
How to use checksums
6b4c80fc03985a4173f5c0b2b3f49849c8d0eaee4ec57be6d47aa6da919a7153
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via maturin/1.15.0

Release files / squawk_cli-2.68.0-py3-none-manylinux_2_28_x86_64.whl

Download URL squawk_cli-2.68.0-py3-none-manylinux_2_28_x86_64.whl
Size 8.0 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
06adbbfa40de45b6d696db6b94610c2a6bb9f0394c1a2f8185ae137a8cb0013b
BLAKE2b-256 checksum
How to use checksums
cce7541d414d0ea33f4cf3ad753941c7ffddd35ed5d2b41340bc541a73027425
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via maturin/1.15.0

Release files / squawk_cli-2.68.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL squawk_cli-2.68.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 7.1 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
d8dfa62ac3684131c01bdf8e748056fa0d98dcf9883d648ccbb22e370fab7c1b
BLAKE2b-256 checksum
How to use checksums
a49f528dac1aa06d23653370407f74d491f0f88a32576a57758e052eb3b847db
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via maturin/1.15.0

Release files / squawk_cli-2.68.0-py3-none-macosx_11_0_arm64.whl

Download URL squawk_cli-2.68.0-py3-none-macosx_11_0_arm64.whl
Size 5.7 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
447d4b42f8c3b1978aba867d28ac2c037a804aba0d11bf7118ab12e82bad5efb
BLAKE2b-256 checksum
How to use checksums
f77ea89fe6dce2b217c29ea197e8b4a4101db28b8a7e553537169d81cc5d6039
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via maturin/1.15.0

Release files / squawk_cli-2.68.0-py3-none-macosx_10_12_x86_64.whl

Download URL squawk_cli-2.68.0-py3-none-macosx_10_12_x86_64.whl
Size 6.0 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
0ddfb0fe1d67ee8c9a46a3e4e3e6f03fe67f713ab865bdd44503284559c8cc84
BLAKE2b-256 checksum
How to use checksums
84232157075dc4b8f4d4817c9e27ad84996b961cfa29a271c700774b20861d31
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via maturin/1.15.0

Release history Release notifications | RSS feed

2.70.0

7 release files

2.69.0

7 release files

This release

2.68.0 This release

7 release files

2.66.0

7 release files

2.65.0

7 release files

2.63.0

7 release files

2.61.0

7 release files

2.60.0

7 release files

2.59.0

7 release files

2.58.0

7 release files

2.55.0

7 release files

2.54.0

7 release files

2.53.0

7 release files

2.52.1

7 release files

2.52.0

7 release files

2.49.0

7 release files

2.48.0

7 release files

2.47.0

7 release files

2.44.0

7 release files

2.43.0

7 release files

2.42.0

7 release files

2.41.0

7 release files

2.40.1

7 release files

2.39.0

7 release files

2.38.0

7 release files

2.37.0

7 release files

2.34.0

7 release files

2.33.2

7 release files

2.33.1

7 release files

2.33.0

7 release files

2.31.0

7 release files

2.30.0

7 release files

2.29.0

7 release files

2.27.0

7 release files

2.26.0

7 release files

2.24.0

7 release files

2.23.0

7 release files

2.21.1

7 release files

2.21.0

7 release files

2.20.0

7 release files

2.19.0

7 release files

2.16.0

7 release files

2.15.0

7 release files

2.14.0

7 release files

2.13.0

7 release files

2.12.0

7 release files

2.11.0

7 release files

2.10.0

7 release files

2.9.0

7 release files

2.8.0

7 release files

2.7.0

7 release files

2.6.0

7 release files

2.5.0

7 release files

2.4.0

7 release files

2.3.0

7 release files

2.2.0

7 release files

2.1.0

7 release files

2.0.0

7 release files

1.6.1

7 release files

1.6.0

7 release files

1.5.5

7 release files

1.5.4

7 release files

1.4.0

7 release files

1.2.0

7 release files

1.1.0

3 release files

1.0.0

3 release files

0.28.0

3 release files

0.27.0

3 release files

0.26.0

3 release files

0.24.1

3 release files

0.24.0

3 release files

0.23.0

3 release files

0.22.0

3 release files

0.21.0

3 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page