Lightweight, source-first SQL AST + compiler + runner.
Reason this release was yanked:
Incorrect semantic versioning: feature-level changes were published as patch release. Use 0.2.0.
Project description
SQLStratum
SQLStratum is a modern, typed, deterministic SQL query builder and compiler for Python with a SQLite runner and a hydration pipeline. It exists to give applications and ORMs a reliable foundation layer with composable SQL, predictable parameter binding, and explicit execution boundaries.
Key Features
- Deterministic compilation: identical AST inputs produce identical SQL + params
- Typed, composable DSL for SELECT/INSERT/UPDATE/DELETE
- Safe parameter binding (no raw interpolation)
- Hydration targets for structured results
- SQLite-first execution via a small Runner API
- Testable compiled output and runtime behavior
Non-Goals
- Not an ORM (no identity map, relationships, lazy loading)
- Not a migrations/DDL system
- Not a full database abstraction layer for every backend yet (SQLite first)
- Not a SQL string templating engine
SQLStratum focuses on queries. DDL statements such as CREATE TABLE or ALTER TABLE are intended to
live in a complementary library with similar design goals that is currently in the works.
Quickstart
import sqlite3
from sqlstratum import SELECT, INSERT, Table, col, Runner
users = Table(
"users",
col("id", int),
col("email", str),
col("active", int),
)
conn = sqlite3.connect(":memory:")
runner = Runner(conn)
runner.exec_ddl("CREATE TABLE users (id INTEGER PRIMARY KEY, email TEXT, active INTEGER)")
runner.execute(INSERT(users).VALUES(email="a@b.com", active=1))
runner.execute(INSERT(users).VALUES(email="c@d.com", active=0))
q = (
SELECT(users.c.id, users.c.email)
.FROM(users)
.WHERE(users.c.active.is_true())
.hydrate(dict)
)
rows = runner.fetch_all(q)
print(rows)
Why Table objects?
SQLStratum’s Table objects are the schema anchor for the typed, deterministic query builder. They
provide column metadata and a stable namespace for column access, which enables predictable SQL
generation and safe parameter binding. They also support explicit aliasing to avoid ambiguous column
names in joins.
Project Structure
- AST: immutable query nodes in
sqlstratum/ast.py - Compiler: SQL + params generation in
sqlstratum/compile.py - Runner: SQLite execution and transactions in
sqlstratum/runner.py - Hydration: projection rules and targets in
sqlstratum/hydrate/
SQL Debugging
SQLStratum can log executed SQL statements (compiled SQL + parameters + duration), but logging is intentionally gated to avoid noisy output in production. Debug output requires two conditions:
- Environment variable gate:
SQLSTRATUM_DEBUGmust be truthy ("1","true","yes", case-insensitive). - Logger gate: the
sqlstratumlogger must be DEBUG-enabled.
Why it does not work by default: Python logging defaults to WARNING level, so even if
SQLSTRATUM_DEBUG=1 is set, DEBUG logs will not appear unless logging is configured.
To enable debugging in a development app:
Step 1 - set the environment variable:
SQLSTRATUM_DEBUG=1
Step 2 - configure logging early in the app:
import logging
logging.basicConfig(level=logging.DEBUG)
# or
logging.getLogger("sqlstratum").setLevel(logging.DEBUG)
Output looks like:
SQL: <compiled sql> | params={<sorted params>} | duration_ms=<...>
Architectural intent: logging happens at the Runner boundary (after execution). AST building and compilation remain deterministic and side-effect free, preserving separation of concerns.
Pydantic Hydration (Optional)
SQLStratum does not depend on Pydantic, but it provides an optional hydration adapter for Pydantic v2 models.
Install:
pip install sqlstratum[pydantic]
Example:
from pydantic import BaseModel
from sqlstratum.hydrate.pydantic import hydrate_model, using_pydantic
class User(BaseModel):
id: int
email: str
row = {"id": "1", "email": "a@b.com"}
user = hydrate_model(User, row)
q = using_pydantic(
SELECT(users.c.id, users.c.email).FROM(users).WHERE(users.c.id == 1)
).hydrate(User)
user_row = runner.fetch_one(q)
Logo Inspiration
Vinicunca (Rainbow Mountain) in Peru’s Cusco Region — a high-altitude day hike from Cusco at roughly 5,036 m (16,500 ft). See Vinicunca for background.
Versioning / Roadmap
Current version: 0.1.1.
Design notes and current limitations are tracked in NOTES.md. Roadmap planning is intentionally
minimal at this stage and will evolve with real usage.
Authorship
Antonio Ognio is the maintainer and author of SQLStratum. ChatGPT is used for brainstorming, architectural thinking, documentation drafting, and project management advisory. Codex (CLI/agentic coding) is used to implement many code changes under Antonio's direction and review. The maintainer reviews and curates changes; AI tools are assistants, not owners, and accountability remains with the maintainer.
License
MIT License.
Contributing
PRs are welcome. Please read CONTRIBUTING.md for the workflow and expectations.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sqlstratum-0.1.1.tar.gz.
File metadata
- Download URL: sqlstratum-0.1.1.tar.gz
- Upload date:
- Size: 18.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96ab7c4d7219c68c6555a62c45f283947e951df8f095542e7cf2072486e47068
|
|
| MD5 |
b6f38b36e822f3067af7d229a2e3d61d
|
|
| BLAKE2b-256 |
d8416148b477af0d651e9c83c91503da6154b75427c57a0aae2f891996a18c39
|
File details
Details for the file sqlstratum-0.1.1-py3-none-any.whl.
File metadata
- Download URL: sqlstratum-0.1.1-py3-none-any.whl
- Upload date:
- Size: 15.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a315c2b1e65701df0514baafb7de8dd778e76927385bf8cb81c20458221b509
|
|
| MD5 |
c2b7e3edfdfffd9fea6005478b9314c2
|
|
| BLAKE2b-256 |
e094f364105317205325ea83b07590cab23ce07b6eb6849a3aef9c984c5b7a84
|