sqltree
sqltree is an experimental parser for SQL, providing
a syntax tree for SQL queries. Possible use cases include:
- Static analysis (for example, to validate column names)
- Translating queries to another SQL dialect
- Autoformatting
sqltree can parse queries:
$ python -m sqltree "SELECT * FROM x WHERE x = 3"
Select(select_exprs=[SelectExpr(expr=Star(), alias=None)], table=Identifier(text='x'), conditions=BinOp(left=Identifier(text='x'), op=Punctuation(text='='), right=IntegerLiteral(value=3)))
And format them:
$ python -m sqltree.formatter "SELECT * from x where x=3"
SELECT *
FROM x
WHERE x = 3
SQL is a big language with a complicated grammar that varies significantly
between database vendors. sqltree is designed to be flexible enough to parse
the full syntax supported by different databases, but I am prioritizing
constructs used in my use cases for the parser. So far, that has meant a focus
on parsing MySQL 8 queries. Further syntax will be added as I have time.
Features
Useful features of sqltree include:
Placeholder support
sqltree supports placeholders such as %s or ? in various positions in
the query, so that queries using such placeholders can be formatted and analyzed.
$ python -m sqltree.formatter 'select * from x where y = 3 %(limit)s'
SELECT *
FROM x
WHERE y = 3
%(limit)s
Better error messages
sqltree's handwritten parser often produces better error messages than MySQL
itself. For example:
$ mysql
mysql> show replicca status;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'replicca status' at line 1
$ python -m sqltree 'show replicca status'
Unexpected 'replicca' (expected one of REPLICA, SLAVE, REPLICAS, TABLES, TABLE, TRIGGERS, VARIABLES, STATUS, COUNT, WARNINGS, ERRORS, COLUMNS, FIELDS, INDEX, INDEXES, KEYS)
0: show replicca status
^^^^^^^^
API
sqltree.sqltree: parse a SQL query and return the parse tree. Seesqltree.parserfor the possible parse nodes.sqltree.formatter.format: reformat a SQL query.sqltree.tools.get_tables: get the tables referenced in a SQL query.
More detailed documentation to follow.
Requirements
sqltree runs on Python 3.6 and up and it has no dependencies.
Using the fixit rule
sqltree embeds a fixit rule for formatting SQL. Here is how to use it:
- Install fixit if you don't have it yet
pip install fixitpython -m fixit.cli.init_config
- Run
python -m fixit.cli.apply_fix --rules sqltree.fixit.SqlFormatRule path/to/your/code
Changelog
Version 0.3.0 (July 12, 2022)
- Add ANSI SQL as a dialect
- Support escaping quotes by doubling them in string literals
- Support scientific notation with a negative exponent
- Fix formatting for quoted identifiers that contain non-alphanumeric characters
- Support the unary
NOToperator - Fix formatting of
LEFT JOINand similar queries
Version 0.2.0 (June 24, 2022)
- Support
SELECT ... INTOsyntax - Support
SET TRANSACTIONsyntax - Support
a MOD Banda DIV bsyntax - Support
GROUP_CONCAT()syntax
Version 0.1.0 (June 13, 2022)
- Initial release
Metadata
Release files for sqltree 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| sqltree-0.3.0.tar.gz | 36.8 kB | Without provenance | Details for sqltree-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| sqltree-0.3.0-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details for sqltree-0.3.0-py2.py3-none-any.whl |
Total release size: 76.1 kB
Release files / sqltree-0.3.0.tar.gz
| Download URL | sqltree-0.3.0.tar.gz |
|---|---|
| Size | 36.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
49c8e5912789d06825921dcc3711710a6a0927bce4d3f1afb78587cf12edc950
|
|
BLAKE2b-256 checksum How to use checksums |
fccbd554cc68e9902fbbb209c0c239dc8e1401f3b2f233fd5999690ed9498b05
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.1 CPython/3.9.13
|
Release files / sqltree-0.3.0-py2.py3-none-any.whl
| Download URL | sqltree-0.3.0-py2.py3-none-any.whl |
|---|---|
| Size | 39.2 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
0ef6fdec6e6a1dbb7c5b2682752e954e886edacfc7e717f389e7fdd25f2e8acf
|
|
BLAKE2b-256 checksum How to use checksums |
31734ff58c610efbe00155bf7d5f7c739900b8f4147c15dacc07ba2f41b452b1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.1 CPython/3.9.13
|
Security for sqltree 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.