Tiny embedded document database for Python with N-dimensional coordinate keys.
Project description
AxisDB
AxisDB is a tiny embedded document database for Python, designed for simple, reliable storage of JSON documents addressed by N-dimensional coordinate keys.
It is library-first, requires no server, and stores all data in a single JSON file with atomic, crash-safe commits.
See also:
USE_CASES.md — a concise overview of practical applications and patterns enabled by this multidimensional JSON storage model.
Key properties
- Library-first design (usable without any server)
- Single-file JSON storage
- Atomic, crash-safe commits via temp-file replace
- Safe multi-process access (single writer, multiple readers) via file locks
- Minimal but useful query + indexing support (correctness-first)
Features
- Embedded JSON document database
- N-dimensional coordinate keys
- Atomic commit and recovery
- Key listing (
list) and multidimensional slicing (slice) - Basic querying (
find) with optional persisted field indexes - Optional FastAPI wrapper with Swagger (
/docs) and ReDoc (/redoc)
Installation
Core library
pip install axisdb
Optional server components
pip install "axisdb[server]"
Basic library usage
Create a database, write a value, and commit:
from axisdb import AxisDB
db = AxisDB.create("./mydb.json", dimensions=2)
db.set(("user1", "orders"), {"count": 3})
db.commit()
ro = AxisDB.open("./mydb.json", mode="r")
print(ro.get(("user1", "orders")))
Notes:
- Dimensions are fixed at database creation time; all keys must be a
tuple[str, ...]of that length. - Values must be JSON-serializable (validated by default on
set). mode="rw"writes are staged in-memory untilcommit();rollback()discards uncommitted changes.mode="r"reloads from disk on each operation to reflect the latest committed state.
Query and indexing (MVP)
AxisDB is optimized for correctness and predictable behavior over complex query planning.
- Indexes are materialized and persisted in the DB file.
- Indexes are rebuilt on each commit (correctness-first MVP).
find()can use indexes only when there are no pending writes in the current session.
Index types
- Prefix index — always maintained; used by
find(prefix=...)to reduce scan work (note:list(prefix=...)currently filters materialized keys directly). - Field indexes — optional, user-defined; can accelerate simple equality predicates of the form
Field(("path", "to", "field"), "==", literal).
Define a field index:
from axisdb import AxisDB
db = AxisDB.create("./mydb.json", dimensions=2)
db.define_field_index("by_customer_id", ("customer_id",))
Query with an expression:
from axisdb import AxisDB
from axisdb.query.ast import Field
db = AxisDB.open("./mydb.json", mode="r")
rows = db.find(prefix=("orders",), where=Field(("customer_id",), "==", "c2"))
Running the FastAPI wrapper (optional)
After installing the server extras:
pip install "axisdb[server]"
Run the server:
python -m uvicorn axisdb.server.app:app --reload
The server will start at:
http://localhost:8000
API documentation
FastAPI automatically exposes interactive documentation:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
REST endpoints (thin wrapper)
The server is intentionally a minimal translation layer over the library:
GET /info?path=...POST /init?path=...&dimensions=...&overwrite=falsePOST /item?path=...(body:{ "coords": [...], "value": ... })GET /item?path=...&coords=...&coords=...DELETE /item?path=...(body:{ "coords": [...] })GET /list?path=...&prefix=...&depth=...GET /find?path=...&prefix=...&field=...&op===&value=...&limit=...
The wrapper does not bypass durability or locking: it opens the database in mode="r" or mode="rw" as needed and uses the same commit semantics.
Concurrency model (locking)
By default (lock=True), AxisDB uses two lock files next to the database file:
*.writer.lock— exclusive lock held for the lifetime of a writer session (mode="rw")*.rw.lock— shared during reads; exclusive duringcommit()
This supports single-writer / multiple-reader access across processes.
Versioning and compatibility
This project follows semantic versioning.
Guaranteed stable within a major version:
- Public
AxisDBAPI:open,create,get,set,delete,exists,list,slice,find,commit,rollback - Public exception types in
axisdb.errors - On-disk file format (
format=axisdb,format_version=2)
May change in minor versions:
- Internal module structure and private attributes
- Index query planning details
Breaking changes will only occur in the next major version.
Development
Run tests:
python -m pytest -q
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 axisdb-1.0.6.tar.gz.
File metadata
- Download URL: axisdb-1.0.6.tar.gz
- Upload date:
- Size: 32.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2b02a757b5a2f95d097164e35cf0fcceb46eaa0ae6b2fcb14c771b327e6e360
|
|
| MD5 |
240c24db5f2ea8062807dca8254f4c0b
|
|
| BLAKE2b-256 |
9b33fe63b1daf136b7058ed91918eec84f52d0136d3f0b6491df3a77fac2607b
|
File details
Details for the file axisdb-1.0.6-py3-none-any.whl.
File metadata
- Download URL: axisdb-1.0.6-py3-none-any.whl
- Upload date:
- Size: 31.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8194f4ffaca503729484212aa8967df6b9b1880655467fa629e34377e7b3741d
|
|
| MD5 |
54fffe08fc9504a4999bf4fb9af98dd0
|
|
| BLAKE2b-256 |
fb76e58919336a827b29e28f2eec768593b3bc0be347b7246d3a4acdefce17e7
|