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.82.tar.gz (273.3 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.82-cp311-abi3-win_amd64.whl (5.2 MB view details)

Uploaded CPython 3.11+Windows x86-64

dirsql-0.3.82-cp311-abi3-manylinux_2_39_x86_64.whl (6.3 MB view details)

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

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

Uploaded CPython 3.11+manylinux: glibc 2.39+ ARM64

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

Uploaded CPython 3.11+macOS 11.0+ ARM64

dirsql-0.3.82-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.82.tar.gz.

File metadata

  • Download URL: dirsql-0.3.82.tar.gz
  • Upload date:
  • Size: 273.3 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.82.tar.gz
Algorithm Hash digest
SHA256 480265505289dadb51ef665a3c0b2d685211a21b4d4bca3b65fe6c8f17d9550f
MD5 668e77f3ca35bdb8b7d6db0237d9ecbb
BLAKE2b-256 89666a46959863de3ee35382552364d5363d60ba11de9da7430ef35a2b9896b2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: dirsql-0.3.82-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.82-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d20cfffaa59d9bfeff7e8211407e2e4074481360a5f131b62fbbce5111e416da
MD5 8ec453eedfeb9c9b8d871f336aa6e1f5
BLAKE2b-256 444f203cba7dce64b1610f1cf15e0600d2d605d9ee1efe735fdf17281b64dbb0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for dirsql-0.3.82-cp311-abi3-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 7f7c018aa5d81c45f3b8fbcd64774e9d8b14e8a731a3d09e74d9430cfcd687ff
MD5 6a335f521fb5782a9812cfae10ae791b
BLAKE2b-256 39431c585574c6e18626ce4b05422235452738d9ddb4648204369a339b4770bc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for dirsql-0.3.82-cp311-abi3-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 b2325e09288a6ddaf901d036a5d7e471b86d3b61ced0202a0c2d6272d8a82f60
MD5 147084bcbeb2b1e4a6c07dce1a19e5ed
BLAKE2b-256 247a65432249f38f923e2beb146737187704013025e60b2fbe70c3b8833e6ca7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for dirsql-0.3.82-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 533175c43d307dcb58bf44c05e4ff7aa5f590b4c4d7384ed5c9a21245b850707
MD5 d28ee4f4449085d78728856006d68ca1
BLAKE2b-256 b1e9720c1427d119351dd1a4a8c4a5ae11c23f5fc608f4ee0f72c7bb81be06c6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for dirsql-0.3.82-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9557dec6871009fefc9e49817491cbcec0332e99d7e9d2d38eedc7b0f262bec8
MD5 2a659afb8902a9b2255151ca1594e855
BLAKE2b-256 f4eba89e566a0769f8ee8a641f8bf86397004803039af5c8958b15e15100dc55

See more details on using hashes here.

Provenance

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