Movatterモバイル変換


[0]ホーム

URL:


squawk-cli

2.20.0 • Public • Published

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 bestpractices around Postgres schemas and SQL.

Install

npm install -g squawk-cli# or via PYPIpip install squawk-cli# or install binaries directly via the releases pagehttps://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 directorydocker 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.sqlwarning[prefer-bigint-over-int]: Using 32-bit integer fields can resultin 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.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 Identity columns instead.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.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.warning[constraint-missing-not-valid]: By default new constraints require a table scan and block writes to the tablewhile 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 tablewhile 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 solutionsfor each rule at https://squawkhq.com/docs/rulesFound 7 issuesin 1 file (checked 1source file)

squawk --help

squawkFind problems in your SQLUSAGE:    squawk [FLAGS] [OPTIONS] [path]... [SUBCOMMAND]FLAGS:        --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 this setting in any config file that exists    -h, --help            Prints help information    -V, --version            Prints version information        --verbose            Enable debug logging outputOPTIONS:    -c, --config <config-path>            Path to the squawk config file (.squawk.toml)        --debug <format>            Output debug info [possible values: Lex, Parse]        --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        --pg-version <pg-version>            Specify postgres version            For example: --pg-version=13.0        --reporter <reporter>            Style of error reporting [possible values: Tty, Gcc, Json]        --stdin-filepath <filepath>            Path to use in reporting for stdinARGS:    <path>...            Paths to searchSUBCOMMANDS:    help                Prints this message or the help of the given subcommand(s)    upload-to-github    Comment on a PR with Squawk's results

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 thesquawk-ignore comment:

-- squawk-ignore ban-drop-columnaltertable 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-databasealtertable t drop column c cascade;

To ignore a rule for the entire rule, usesquawk-ignore-file:

-- squawk-ignore-file ban-drop-columnaltertable t drop column c cascade;-- also ignored!altertable t drop column d cascade;

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

-- squawk-ignore-filealtertable t drop column c cascade;createtablet (aint);

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 theSquawk 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 PullRequests using theupload-to-github subcommand.

Here's an example comment created bysquawk using theexample.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 withpre-commit. Add the followingto your project's.pre-commit-config.yaml:

repos:  -repo:https://github.com/sbdchd/squawkrev:v0.10.0hooks:      -id:squawkfiles:path/to/postgres/migrations/written/in/sql

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

Prior Art / Related

Related Blog Posts / SE Posts / PG Docs

Dev

cargo installcargo 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, runningcargo 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. Update theCHANGELOG.md

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

  2. Runs/update-version

    # update version in squawk/Cargo.toml, package.json, flake.nix to 4.5.3s/update-version 4.5.3
  3. Create a new release on GitHub

    Use the text and version from theCHANGELOG.md

Algolia

The squawkhq.com Algolia index can be found onthe 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. Thelinters then use an AST layered on top of the CST to navigate and recordwarnings, which are then pretty printed!

Package Sidebar

Install

npm i squawk-cli

Weekly Downloads

56,286

Version

2.20.0

License

(Apache-2.0 OR MIT)

Unpacked Size

19.3 kB

Total Files

6

Last publish

Collaborators

  • cdignam
  • sbdchd

[8]ページ先頭

©2009-2025 Movatter.jp