Skip to main content

Ephemeral SQL index over a local directory

Project description

dirsql (Python SDK)

Ephemeral SQL index over a local directory. dirsql watches a filesystem, ingests structured files into an in-memory SQLite database, and exposes a SQL query interface -- the filesystem is always the source of truth.

Documentation

Also available as dirsql on crates.io and dirsql on npm.

Installation

pip install dirsql

Requires Python >= 3.12. Ships as a native extension (Rust via PyO3); prebuilt binary wheels are provided for common platforms.

Quick start

DirSQL is async by default: the constructor returns immediately, scanning runs in a background thread, and you await db.ready() before querying. Each table is a (ddl, glob, extract) triple: the DDL defines the SQLite schema, the glob selects files (relative to the root), and extract turns a matched file into a list of row dicts. dirsql does not read file contents -- if extract needs the file body it reads path itself; return an empty list to skip a file.

import asyncio
import json
from dirsql import DirSQL, Table

async def main():
    db = DirSQL(
        "./my-blog",
        tables=[
            Table(
                ddl="CREATE TABLE posts (title TEXT, author TEXT)",
                glob="posts/*.json",
                extract=lambda path: [json.loads(open(path, encoding="utf-8").read())],
            ),
        ],
    )
    await db.ready()

    posts = await db.query("SELECT * FROM posts WHERE author = 'alice'")
    print(posts)

asyncio.run(main())

Multiple tables and joins

db = DirSQL(
    "./my-blog",
    tables=[
        Table(
            ddl="CREATE TABLE posts (title TEXT, author_id TEXT)",
            glob="posts/*.json",
            extract=lambda path: [json.loads(open(path, encoding="utf-8").read())],
        ),
        Table(
            ddl="CREATE TABLE authors (id TEXT, name TEXT)",
            glob="authors/*.json",
            extract=lambda path: [json.loads(open(path, encoding="utf-8").read())],
        ),
    ],
)
await db.ready()

results = await db.query("""
    SELECT posts.title, authors.name
    FROM posts JOIN authors ON posts.author_id = authors.id
""")

Ignoring files

Pass ignore patterns to skip files during scanning and watching:

db = DirSQL(
    "./my-blog",
    ignore=["**/drafts/**", "**/.git/**"],
    tables=[...],
)

Loading SQLite extensions

Pass extensions to load SQLite extension shared libraries onto the connection at startup (before any CREATE TABLE). Each entry is a dict with a path and an optional entrypoint init-symbol override:

db = DirSQL(
    "./my-blog",
    tables=[...],
    extensions=[
        {"path": "./ext/vec0.dylib", "entrypoint": "sqlite3_vec_init"},
        {"path": "./ext/myext.so"},  # entrypoint derived from the filename
    ],
)
await db.ready()

# The extension's functions are now callable in queries:
rows = await db.query("SELECT vec_version() AS v")

dirsql enables extension loading only while loading the configured libraries, then disables it again, so the SQL load_extension() function is never exposed to your queries. Programmatic entries load first, followed by any [[dirsql.extension]] entries declared in a config file. See the config reference.

Watching for changes

db.watch() returns an async iterator of row-level change events as files change on disk:

async for event in db.watch():
    print(f"{event.action} on {event.table}: {event.row}")
    if event.action == "error":
        print(f"  error: {event.error}")

Each event has .action ("insert", "update", "delete", or "error"), .table, .row (the new row, or the deleted row on delete), .old_row (the previous row, on update), .file_path, and .error (on error).

CLI

pip install dirsql also installs a dirsql console script that runs an HTTP server exposing the SDK over HTTP: POST /query for SQL and GET /events for a Server-Sent Events change stream. Run dirsql (or uvx dirsql) to start it. See the CLI reference.

License

MIT

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

dirsql-0.3.85.tar.gz (273.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dirsql-0.3.85-cp311-abi3-win_amd64.whl (5.2 MB view details)

Uploaded CPython 3.11+Windows x86-64

dirsql-0.3.85-cp311-abi3-manylinux_2_39_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.39+ x86-64

dirsql-0.3.85-cp311-abi3-manylinux_2_39_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.39+ ARM64

dirsql-0.3.85-cp311-abi3-macosx_11_0_arm64.whl (5.5 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

dirsql-0.3.85-cp311-abi3-macosx_10_12_x86_64.whl (5.7 MB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

Details for the file dirsql-0.3.85.tar.gz.

File metadata

  • Download URL: dirsql-0.3.85.tar.gz
  • Upload date:
  • Size: 273.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dirsql-0.3.85.tar.gz
Algorithm Hash digest
SHA256 1ae631af93b26ad1cdfc4007bc8128acdf17d494629680eb6c7d112cbe003dd1
MD5 a467b803f7e7137949aeeb85b9dccb72
BLAKE2b-256 e811358be68e74145abb4c330b216a001e1f1c2fe3a1a4b582ca0514a79cf55b

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.85.tar.gz:

Publisher: release.yml on thekevinscott/dirsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dirsql-0.3.85-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: dirsql-0.3.85-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dirsql-0.3.85-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f4ba4db5f162bd66f7b7167573d1f10ea719ab3b8592f4a12c71f7888a5a4865
MD5 ce525039a004944b6dc573ea49f72548
BLAKE2b-256 2c0a1f067c735ff311011e3f6e79e9c593edc3f4ed746cf18cddf8bc3c535c8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.85-cp311-abi3-win_amd64.whl:

Publisher: release.yml on thekevinscott/dirsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dirsql-0.3.85-cp311-abi3-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for dirsql-0.3.85-cp311-abi3-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 f568018d72b1c180063c7985d4a9ee916ceae28c63bb81a020ddad45b10f2bef
MD5 66a830aff5900d8b8c2b5417cd986393
BLAKE2b-256 a57f10e4aaeceaab40d36c6993c56be137b89485ab2fc76fd5b94691bdba08df

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.85-cp311-abi3-manylinux_2_39_x86_64.whl:

Publisher: release.yml on thekevinscott/dirsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dirsql-0.3.85-cp311-abi3-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for dirsql-0.3.85-cp311-abi3-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 d329276ee10292973da7c6ad435d571c3c1f280610d61f0b0c6e41a0bcca6848
MD5 dfdce75efa8dd9d7e695b9057bb4cd8f
BLAKE2b-256 aad205c5030cea63486bf068adb88691de4f67c038510dc56ce6c98ce117ee55

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.85-cp311-abi3-manylinux_2_39_aarch64.whl:

Publisher: release.yml on thekevinscott/dirsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dirsql-0.3.85-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dirsql-0.3.85-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34bd9defbbaf6b767bbabef4f589aca30e1b9db0b55dfd36de04514505504a1c
MD5 d883a1317ead6215e18e3cab82176566
BLAKE2b-256 805d6b900ff0c2b8add5bbbfdf8edb46391fc6139ddff5a6e86773b864732ae5

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.85-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on thekevinscott/dirsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dirsql-0.3.85-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for dirsql-0.3.85-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2b7c785bea810d0e2db189c6316b622cf1218dcf9c25ee001531a04e78be5c26
MD5 eed6e27824f578d008976ad345633772
BLAKE2b-256 af60ff50bc2b4c83526dd69bdf97d991160e8d65e76398064f19509274375ee7

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.85-cp311-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on thekevinscott/dirsql

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