Skip to main content

An extensible linter for SQL

Project description

build status Documentation Status PyPI version

Catch unsafe SQL migrations.

$ squabble sql/migration.sql
sql/migration.sql:4:46 ERROR: column "uh_oh" has a disallowed constraint [1004]
ALTER TABLE big_table ADD COLUMN uh_oh integer DEFAULT 0;
                                               ^
# Use --explain to get more information on a lint violation
$ squabble --explain 1004
ConstraintNotAllowed
     When adding a column to an existing table, certain constraints can have
     unintentional side effects, like locking the table or introducing
     performance issues.
     ...

Squabble can also be integrated with your editor to catch errors in SQL files.

$ echo 'SELECT * FROM WHERE x = y;' | squabble --reporter=plain
stdin:1:15 CRITICAL: syntax error at or near "WHERE"

Currently, most of the rules have been focused on Postgres and its quirks. However, squabble can parse any ANSI SQL and new rules that are specific to other databases are appreciated!

Installation

$ pip3 install squabble
$ squabble --help

If you’d like to install from source:

$ git clone https://github.com/erik/squabble.git && cd squabble
$ python3 -m venv ve && source ve/bin/activate
$ python setup.py install
$ squabble --help

Configuration

To see a list of rules, try

$ squabble --list-rules

Then, to show more verbose information about a rule (such as rationale and configuration options)

$ squabble --show-rule AddColumnsDisallowConstraints

Once a configuration file is in place, it can be passed explicitly on the command line, or automatically looked up.

$ squabble -c path/to/config ...

If not explicitly given on the command line, squabble will look for a file named .squabblerc in the following places (in order):

  • ./.squabblerc

  • (git_repo_root)/.squabblerc

  • ~/.squabblerc

Per-File Configuration

Configuration can also be applied at the file level by using SQL line comments in the form -- squabble-enable:RuleName or -- squabble-disable:RuleName.

For example, to disable RuleA and enable RuleB just for one file, this could be done:

-- squabble-disable:RuleA
-- squabble-enable:RuleB config=value array=1,2,3
SELECT email FROM users WHERE ...;

To prevent squabble from running on a file, use -- squabble-disable. Note that this will also disable syntax checking. Note that this flag will take precedence over any other configuration set either on the command line or in the rest of the file.

Example Configuration

{
  "reporter": "color",

  "plugins": [
    "/some/directory/with/custom/rules"
  ],

  "rules": {
    "AddColumnsDisallowConstraints": {
      "disallowed": ["DEFAULT", "FOREIGN", "NOT NULL"]
    }
  }
}

Prior Art

squabble is of course not the first tool in this space. If it doesn’t fit your needs, consider one of these tools:

  • sqlcheck - regular expression based (rather than parsing), focuses more on SELECT statements than migrations.

  • sqlint - checks that the syntax of a file is valid. Uses the same parsing library as squabble.

  • sqlfluff - focused more on style and formatting, seems to still be a work in progress.

Acknowledgments

This project would not be possible without:

  • libpg_query - Postgres query parser

  • pglast - Python bindings to libpg_query

  • Postgres - …obviously

The logo image used in the documentation is created by Gianni - Dolce Merda from the Noun Project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

squabble-1.4.0.tar.gz (30.9 kB view details)

Uploaded Source

File details

Details for the file squabble-1.4.0.tar.gz.

File metadata

  • Download URL: squabble-1.4.0.tar.gz
  • Upload date:
  • Size: 30.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Python-urllib/3.7

File hashes

Hashes for squabble-1.4.0.tar.gz
Algorithm Hash digest
SHA256 d3948826a8804400a6deba7015ab5244a6611d9c7003f391a9a10b875b17fb9d
MD5 769ed9ce607c8a1144354d7237ccfd82
BLAKE2b-256 b09beec6452b147bce155b15e1416b54b0bb7414e34df3d4aa62a68e3da3ec5f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page