Sidol
SQL for everything. Read, write, and delete across any API or database using plain SQL.
SELECT→ executed through DuckDB (fast, in-memory, federated)INSERT/UPDATE/DELETE→ parsed by sqlglot, routed to connector write APIs- Built-in connectors: ServiceNow, CSV, SQLite
- Extensible: implement
BaseConnectorto add any source
Connector Support
| Connector | SELECT | INSERT | UPDATE | DELETE | Filter Pushdown |
|---|---|---|---|---|---|
| ServiceNow | ✅ | ✅ | ✅ | ✅ | ✅ |
| CSV | ✅ | ✅ | ✅ | ✅ | ❌ |
| SQLite | ✅ | ✅ | ✅ | ✅ | ✅ |
| Airtable | ✅ | ✅ | ✅ | ✅ | ✅ |
See ROADMAP.md for phased delivery (Phase 2 current focus).
import sidol
db = sidol.connect()
db.register("incidents", sidol.ServiceNowConnector(instance="myco", table="incident", ...))
db.register("local", sidol.SQLiteConnector(path="./data.db"))
tbl = db.sql("SELECT number, state FROM incidents WHERE priority = 1") # pyarrow.Table
db.sql("UPDATE incidents SET state = 'closed' WHERE number = 'INC001'")
Setup (with uv — recommended)
uv is a fast Python package manager. Install it once, then:
# Install uv (one-time)
# Windows:
winget install --id=astral-sh.uv -e
# macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone & install all dependencies in ~2 seconds
git clone https://github.com/mitayan0/sidol
cd sidol
uv sync
# Run tests
uv run pytest
# Run linter
uv run ruff check sidol/
# Type-check
uv run mypy sidol/
Setup (classic pip)
pip install -e .
pip install pytest pytest-asyncio respx mypy ruff
python -m pytest
Architecture
SQL string
│
├─ SELECT ──→ DuckDB (in-memory) ──→ connector.fetch() per table ──→ DataFrame
│
└─ DML ─────→ sqlglot AST ──→ extract table/values/filters ──→ connector.insert/update/delete()
Three layers:
- SQL interface —
sidol.connect(),db.sql(),db.register() - Router —
sidol/router.pyparses and dispatches - Connectors — pluggable
BaseConnectorimplementations
Writing a Connector
from sidol.connectors.base import BaseConnector
from sidol.types import Schema, Column, Capabilities, WriteResult
class MyConnector(BaseConnector):
def schema(self) -> Schema:
return Schema(tables={"mytable": [Column("id", "int", primary_key=True)]})
def fetch(self, table, columns, filters, limit, offset):
yield {"id": 1, "name": "hello"}
def capabilities(self) -> Capabilities:
return Capabilities(readable=True, insertable=True)
def insert(self, table, rows) -> WriteResult:
...
return WriteResult(affected_rows=len(rows))
Supported SQL Subset (v1)
| Statement | Support |
|---|---|
SELECT |
✅ Full (via DuckDB — JOINs, aggregates, CTEs) |
INSERT INTO t (cols) VALUES (...) |
✅ Literal values only |
UPDATE t SET col=val WHERE ... |
✅ Simple equality filters |
DELETE FROM t WHERE ... |
✅ Simple equality filters |
CREATE TABLE |
❌ Not supported in v1 |
| Subqueries in DML | ❌ Not supported in v1 |
License
MIT — see LICENSE
Metadata
Release files for sidol 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sidol-0.1.3.tar.gz | 65.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sidol-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 92.6 kB
Release files / sidol-0.1.3.tar.gz
| Download URL | sidol-0.1.3.tar.gz |
|---|---|
| Size | 65.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
701064aec7c52b08f3478f6829d65bef3b64abb98629bcc39dcdbd91e8c36fed
|
|
BLAKE2b-256 checksum How to use checksums |
8ab1e877de7f8cc804ecfeb2b15f511f8e9a299b65469bed78ae8fb2cfcdb4ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 14, 2026.
Transparency logRelease files / sidol-0.1.3-py3-none-any.whl
| Download URL | sidol-0.1.3-py3-none-any.whl |
|---|---|
| Size | 27.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
63abbad091db47277963a685ed049063d965c1fed57e32742e7eda6d867af5ab
|
|
BLAKE2b-256 checksum How to use checksums |
330b451f3c07689d05d4d5414b6c16b07ffc3ef77600c480a654cdc1caa4b2a8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 14, 2026.
Transparency log