Skip to main content

SQLite SQL tools — parser, formatter, validator, and MCP server

Project description

syntaqlite

Parse, format, and validate SQLite SQL from Python using SQLite's own grammar and tokenizer. No approximations: if SQLite accepts it, syntaqlite parses it.

Docs · Playground · GitHub

pip install syntaqlite

Requires Python 3.10+. Wheels for Linux (x86_64, aarch64), macOS (x86_64, arm64), and Windows (x86_64).

Library

Everything goes through a Syntaqlite instance. Create one and reuse it across many calls:

import syntaqlite

with syntaqlite.Syntaqlite() as sq:
    print(sq.format_sql("select 1"))

Formatting

sql = "select u.id, u.name, p.title from users u join posts p on u.id = p.user_id where u.active = 1 and p.published = true order by p.created_at desc limit 10"
print(sq.format_sql(sql))
SELECT u.id, u.name, p.title
FROM users AS u
JOIN posts AS p ON u.id = p.user_id
WHERE
  u.active = 1
  AND p.published = true
ORDER BY
  p.created_at DESC
LIMIT 10;

Raises syntaqlite.FormatError on invalid input.

Parsing

sq.parse() returns a full AST as typed Python objects, one per statement:

stmts = sq.parse("SELECT 1 + 2 FROM foo")
stmt = stmts[0]  # SelectStmt

print(type(stmt).__name__)       # SelectStmt
print(stmt.columns[0].expr)      # BinaryExpr(...)
print(stmt.from_clause)          # TableRef(...)
print(stmt.where_clause)         # None

Every node type is a __slots__ class with typed attributes, so you get IDE autocomplete and isinstance checks:

from syntaqlite.nodes import SelectStmt, BinaryExpr

assert isinstance(stmt, SelectStmt)
assert isinstance(stmt.columns[0].expr, BinaryExpr)

Enum and flag fields are IntEnum/IntFlag from syntaqlite.enums:

from syntaqlite.enums import BinaryOp

expr = stmt.columns[0].expr
print(expr.op)  # BinaryOp.PLUS

For performance-sensitive code, use sq.parse_raw() to get plain dicts instead of typed objects.

Tokenizing

for tok in sq.tokenize("SELECT 1 + 2"):
    print(tok["text"], tok["category"])
SELECT keyword
  other
1 number
  other
+ operator
  other
2 number

Each token is a dict with text, offset, length, type, and category fields.

Analysis

Check SQL against a schema without touching a database. Catches unknown tables, columns, functions, CTE column mismatches, and more.

schema = syntaqlite.Schema(
    tables=[syntaqlite.Table("users", columns=["id", "name", "email"])],
)
result = sq.analyze("SELECT nme FROM users", schema)
for d in result.diagnostics:
    print(f"{d.severity}: {d.message}")
error: unknown column 'nme'

Switch output to get formatted diagnostics with source locations and suggestions:

print(sq.analyze(
    "SELECT nme FROM users", schema,
    output=syntaqlite.AnalysisOutput.TEXT,
))
error: unknown column 'nme'
 --> <input>:1:8
  |
1 | SELECT nme FROM users
  |        ^~~
  = help: did you mean 'name'?

Schema also accepts raw DDL:

schema = syntaqlite.Schema(ddl="CREATE TABLE orders (id INTEGER, total REAL);")
result = sq.analyze("SELECT * FROM orders", schema)

Column lineage

For query-bearing statements, the result includes column lineage:

schema = syntaqlite.Schema(
    tables=[syntaqlite.Table("users", columns=["id", "name", "email"])],
)
result = sq.analyze("SELECT id, name FROM users", schema)
for col in result.lineage.columns:
    print(f"{col.name} <- {col.origin}")
id <- users.id
name <- users.name

CLI

The pip package also bundles the syntaqlite binary:

syntaqlite fmt -e "select 1, 2, 3"
syntaqlite analyze query.sql
syntaqlite parse -e "SELECT * FROM users"

The CLI supports pinning to a specific SQLite version or enabling compile-time flags to match your target environment:

syntaqlite --sqlite-version 3.32.0 validate query.sql
syntaqlite --sqlite-cflag SQLITE_ENABLE_MATH_FUNCTIONS validate query.sql

See the CLI reference for all commands and flags.

License

Apache 2.0. SQLite components are public domain under the SQLite blessing.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

syntaqlite-0.5.7-py3-none-win_amd64.whl (2.2 MB view details)

Uploaded Python 3Windows x86-64

syntaqlite-0.5.7-py3-none-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

syntaqlite-0.5.7-py3-none-manylinux_2_28_aarch64.whl (2.5 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

syntaqlite-0.5.7-py3-none-macosx_11_0_universal2.whl (2.4 MB view details)

Uploaded Python 3macOS 11.0+ universal2 (ARM64, x86-64)

syntaqlite-0.5.7-py3-none-macosx_10_13_universal2.whl (2.5 MB view details)

Uploaded Python 3macOS 10.13+ universal2 (ARM64, x86-64)

File details

Details for the file syntaqlite-0.5.7-py3-none-win_amd64.whl.

File metadata

  • Download URL: syntaqlite-0.5.7-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for syntaqlite-0.5.7-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 a3836a95d14efb48d7e46170b763902ca3de67fd43b7b5efa8e9ca448ce0b8de
MD5 bd68e3a7760f9d878cd7f14e388b7123
BLAKE2b-256 f45e527f90e887fd49d2fbc3e9dd203ee9974e171a8471c16fe183ba40c0f452

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.7-py3-none-win_amd64.whl:

Publisher: release.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.5.7-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.5.7-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f9ed9b70abcadf1fadd600a7e949546cad9018f584aea243fa1513d2b394ea81
MD5 938825a325d4966b3cfcf4fdf19ee0af
BLAKE2b-256 3fddb07b0a2a156193205a2a4b38654d772e70b6cdafe2a7d01151c59c101b7d

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.7-py3-none-manylinux_2_28_x86_64.whl:

Publisher: release.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.5.7-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.5.7-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0be4ca25cdbca782207cb9927c6e1f523bdba88b2851b36d0c7b51049a4371c5
MD5 a8d13a0f1e66ec865a1240827fb7bfea
BLAKE2b-256 9afb6530cb8bdb06bf5cf2c30f3b8605bd4ab2b7ebc2540623ccb64af05c5bf2

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.7-py3-none-manylinux_2_28_aarch64.whl:

Publisher: release.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.5.7-py3-none-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for syntaqlite-0.5.7-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 7e0aff47266fb617cb93ffc2c36f22f5ec013ca2769db5c3ff6f2baf114da236
MD5 2a9cd9847f43905e6c7c8fccde79644f
BLAKE2b-256 f96dcacca20bf854baac1553d1361f8b7fa56c69f0a473138695753224d08ba8

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.7-py3-none-macosx_11_0_universal2.whl:

Publisher: release.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syntaqlite-0.5.7-py3-none-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for syntaqlite-0.5.7-py3-none-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c035bb4d9aff4b003e0ce5e283d612d0b8b5371e2ff5bb426fa650c9c5bfe279
MD5 7e00c96e041bd7ef5f1980f142155830
BLAKE2b-256 36a8c080912912be7801d41cd41317a879f6d0031c139511f1002b19ed6f6dd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.7-py3-none-macosx_10_13_universal2.whl:

Publisher: release.yml on LalitMaganti/syntaqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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