Kanta No-SQL database for async Python and frameworks such as FastAPI and Sanic
Project description
Kanta database
Kanta is a small embedded NoSQL store for async Python apps. It keeps live state in memory, writes transactional diffs to an append-only log, and supports versioned schema migrations.
Why Kanta
- Fast synchronous reads and modifications on native Python objects
- Durable writes with append-only file and periodic snapshots
- Transaction semantics with rollback on failure
- Explicit schema evolution via
migrate_vNfunctions - Line-based JSON or binary MessagePack, or bring your own serializer
- Even in JSON we can use non-string keys, bytes, datetimes, UUID and other types
This design is often preferable when you want low-latency local persistence without operating a separate database service. You get straightforward deployment, auditable history, and deterministic replay while keeping application state ergonomic to work with.
Queries and updates on native data are far faster than over an SQL server connection, and we can can provide fully synchronous operation. The limitation is that you can only use the same database within a single process at a time, but this is well suited for async programming.
Quick Start
import asyncio
import msgspec
from uuid import UUID, uuid7
from kanta import Kanta
class User(msgspec.Struct):
name: str = ""
email: str | None = None
class Data(msgspec.Struct):
users: dict[UUID, User] = {}
async def main() -> None:
async with Kanta("data.kantadb", Data()) as kanta:
user_id = uuid7()
with kanta.transaction(action="create_user") as data:
data.users[user_id] = User(name="Alice")
asyncio.run(main())
Core Concepts
- Define your schema as a
msgspec.Structroot object. - Mutate data inside
with kanta.transaction(...):. - Let Kanta flush queued changes to disk in the background.
- Use snapshots and replay for fast startup and full history.
Migrations
Adding or removing a field and other such simple operations are automatic, but when the time comes to really change your data model, implement a migrate_v1 function that converts your old data to the new form. This works on plain built-in dict and other types, to avoid needing to preserve old versions of your structs.
Pass a module (or import path) containing migrate_vN functions:
kanta = Kanta("data.kantadb", Data(), migrations="myapp.migrations")
await kanta.open()
Kanta tracks migration version metadata automatically, and fast forwards your database to current version by running all the migrations needed while opening the database.
On-Disk Format
Kanta in JSON mode (default) stores newline-delimited records. Transaction history is viewable by any simple text editor, and rollbacks to prior state are done by simply removing final lines (one per transaction)
MsgPack mode uses binary records with length and checksum to avoid data corruption.
- Change line: JSON object with metadata +
diff - Snapshot line:
SNAPSHOT { ... full state ... }
See docs/database.md for format details and invariants.
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 kanta-0.1.1.tar.gz.
File metadata
- Download URL: kanta-0.1.1.tar.gz
- Upload date:
- Size: 24.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
048a6e5bc395bae52799f2aec35d01d759308d0126e32ee535ff8fd2868fd2d9
|
|
| MD5 |
fc5f902d6a34673fe965f1735c01dcf1
|
|
| BLAKE2b-256 |
eec813eec7f157a366f50d45f8ef14f17bd829077652e238830d6e8d1dac683b
|
File details
Details for the file kanta-0.1.1-py3-none-any.whl.
File metadata
- Download URL: kanta-0.1.1-py3-none-any.whl
- Upload date:
- Size: 25.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d51e8f039334b29be439554944666edd80d017f39ae3b154e62141916acde19c
|
|
| MD5 |
c361e4d3bbe952176e6b75a3a48ae393
|
|
| BLAKE2b-256 |
aacad587a01e4f20487c5da8ec7f4f5f84b96a4693edfc43fa48d22ddf04441a
|