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.4-py3-none-win_amd64.whl (2.2 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

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

syntaqlite-0.5.4-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.4-py3-none-win_amd64.whl.

File metadata

  • Download URL: syntaqlite-0.5.4-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.4-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f09081d0d0317f7c47e9b2f921ebd5cff09feabf765865f0cf938eb3d2e18a88
MD5 198dc7ff6c54a6c95f9e7f23dc3e26e6
BLAKE2b-256 afe8d148f7f09cef5d2073e06fadda2a561a3d76d740f61ff4abf05cd9c23b1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.4-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.4-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.5.4-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 299ebec626af3a648236b8113d7e4d8619e04f667c4d85ca7b2f4730ffd76a79
MD5 23407d26616bebad72d6ffb87cdbc54f
BLAKE2b-256 fd23f0dd75d832927a0220ee1df144b8d24226e18171b2bd1eef85335f781a9c

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.4-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.4-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for syntaqlite-0.5.4-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d192924644f381431ce4e21de393fd6817b6a0fffa6681338e3ba92fd9a1815c
MD5 32a8073c57bb38c7b06df778b368f308
BLAKE2b-256 6768d61d70aaf8c94b7d64033970494d895b19652d8f9e4ca1097b6e8c44ccfe

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.4-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.4-py3-none-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for syntaqlite-0.5.4-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4bac0ec16aa33b0b5c5e0c03e71cfbde282d72109de1e8d0fbc58b27b65bdfbf
MD5 89653db861c24f541fcb4673e510b326
BLAKE2b-256 05f9fa73b893a963fa47c76a826bd31c3e61b473a3e82de29db4206381869e4c

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.4-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.4-py3-none-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for syntaqlite-0.5.4-py3-none-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 289b913c0f7b88c9b8f7b3c15e4eb7c876fbca8796a3ef0da853cffd7d6a9b22
MD5 7fee67dd7fec7f8559b04668a7504576
BLAKE2b-256 28f0365b70d598d7d4baec3c7305cde8e8ce68facc6b2d1df5f3278ea6e3412f

See more details on using hashes here.

Provenance

The following attestation bundles were made for syntaqlite-0.5.4-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