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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

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

syntaqlite-0.5.10-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.10-py3-none-win_amd64.whl.

File metadata

  • Download URL: syntaqlite-0.5.10-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.10-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 2892e5af68a6d679deb997dc5a28cb486bb31c9e155be8b29462b418696836e7
MD5 2cb854b2e37a083ac2cf20cf331c90fc
BLAKE2b-256 9088a1893e85b7a2921d669bfc16c09ee4fad81e1a2fe1d2f3318bdcd45099bd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for syntaqlite-0.5.10-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a3cb74ff58e3c0af05bfb03bc3fc025ad0e758c034324d6e651e24b7c01a4d12
MD5 797f69757cbfb9f21c74eeae320fe359
BLAKE2b-256 e0596515622fb3e56543bbea0f37ca744f2ecda24b0b9e3ba43e84cbd7dd4b79

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for syntaqlite-0.5.10-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4b77217d984f5582fafc42a6e8e1ac4b4ec3b54171660f036c51e47ec3438fe4
MD5 e2fc6a1cf17a4a01e56675ab194f66ef
BLAKE2b-256 e54ee1556cb22f5c8bba2e6a052be7407c620e4a52198dcab829c848548b00d4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for syntaqlite-0.5.10-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3357b629cb8a982e95637e7abbed863ccdf051b18fc3e3e1b234553675d890bc
MD5 4f4872b457eb0fe8dd4119b9e4b127c3
BLAKE2b-256 44d722d81adec15f1ff8d74e066fd4e445a5d62f6f9476ea90501c838066160d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for syntaqlite-0.5.10-py3-none-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 79e447789e0e98109fffa3778878a8972439410c2f62fbec94802be8bc316ae3
MD5 7d4942d56513972cd4458eab08b497aa
BLAKE2b-256 97dbb95a290e8503d5773cda1992faf953284166083278e72bd77f70f580c07b

See more details on using hashes here.

Provenance

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