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.99.tar.gz (280.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.99-cp311-abi3-win_amd64.whl (5.3 MB view details)

Uploaded CPython 3.11+Windows x86-64

dirsql-0.3.99-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.99-cp311-abi3-manylinux_2_39_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.39+ ARM64

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

Uploaded CPython 3.11+macOS 11.0+ ARM64

dirsql-0.3.99-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.99.tar.gz.

File metadata

  • Download URL: dirsql-0.3.99.tar.gz
  • Upload date:
  • Size: 280.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.99.tar.gz
Algorithm Hash digest
SHA256 83cc27f70429cadff8bae1db7281580c2f0772f7d7a755ba98701af63684c3ff
MD5 ab1e162ff1e0de2827f952d6a2e92e97
BLAKE2b-256 47381a3f877c82e1c22300302bc4fb9ce2d9de9f8900ea1c5f7fa3880b8f09ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.99.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.99-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: dirsql-0.3.99-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 5.3 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.99-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 49e4eb6c6fed394e0ff2c593fea4f8a0e2718765aa7bb4551b16d4620393b9df
MD5 913962b3c3651be065d7f000fdb83bb2
BLAKE2b-256 0190de12224fa3f9465e2dab468fea4267bd7e2cbc65b4a035776f06d78d1e59

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.99-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.99-cp311-abi3-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for dirsql-0.3.99-cp311-abi3-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 9633940b5aee6c9ba74ff2a21b55f2a48a6f94b6f9088d2f41b755d1ef63a7d1
MD5 2d027513b7a620eab112ed4ff91255d5
BLAKE2b-256 daef71bd937966e8cfb50dfcf686050bf3e4156e1bd5a5ec87e4e7b8bbddc177

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.99-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.99-cp311-abi3-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for dirsql-0.3.99-cp311-abi3-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 b191e05cf15980d835abf12b4d81ed328e347243ece4505d61e0ba44f87d5212
MD5 618350eb44c57c764cd24d086a921cab
BLAKE2b-256 198f5cc74c913d0dc41bbf2c8a0a87de4011c2a8508566ce583ef0f741056230

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.99-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.99-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dirsql-0.3.99-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2d138b178e2cd8a157b001c9beb1ab3c4cef2f769fb1d29aced2ddc0d1e5afb3
MD5 cd319498dd79d206202404a2098d8548
BLAKE2b-256 a5a4380765d8400bc9edc498189494c21e39c8c0f66e1d0c30f452ca8d9b86d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.99-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.99-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for dirsql-0.3.99-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1429cc32aa648ae85bc9414125df8a4e53e1af5b7b921d694f5dae79ef76ce2c
MD5 ea7827cd3a40fe374ea1e3510ef42d7f
BLAKE2b-256 a63324d6606257c7e78303c4f0a849702f3a1769c3da013b5610638fd3f4cb80

See more details on using hashes here.

Provenance

The following attestation bundles were made for dirsql-0.3.99-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