Skip to main content

Python bindings for Typra, a typed embedded database.

Project description

typra (Python)

CI PyPI

Official CPython bindings for Typra (PyO3 native extension): a typed, embedded database with a Rust core.

Status

You get a durable schema catalog, validation, nested row values (record v2 on insert; v1 segments still replay), and constraints in a single .typra file, plus in-memory databases and snapshot bytes.

Queries and secondary indexes (0.7+): register optional indexes_json on register_collection, then use db.collection("name").where("field", value).and_where(...).limit(n).explain() and all() / all(fields=[...]) for subset rows. A longer on-disk + reopen example lives in the Python user guide — Realistic workflow. SQL text and DB-API layers are still out of scope—see the roadmap.

Resource Link
Repository github.com/eddiethedean/typra
Rust crates typra on crates.io
Full Python guide docs/guide_python.md
Getting started docs/guide_getting_started.md
Migrating 0.4 → 0.5 docs/migration_0.4_to_0.5.md
Migrating 0.5 → 0.6 docs/migration_0.5_to_0.6.md
Migrating 0.6 → 0.7 docs/migration_0.6_to_0.7.md
Rust module layout docs/03_rust_crate_and_module_layout.md
Changelog CHANGELOG.md

Requirements

  • CPython 3.9+
  • Wheels use the stable ABI (cp39-abi3): one wheel per platform, compatible with Python 3.9+ on that platform.

Install

pip install "typra>=0.8.0,<0.9"

Pin the minor range you test against; pre-1.0 releases may still change APIs or the on-disk format between minors.

Quick start

# Setup: module, in-memory DB, and `books` collection (PK `title`).
import typra

db = typra.Database.open_in_memory()
cid, ver = db.register_collection(
    "books",
    '[{"path": ["title"], "type": "string"}]',
    "title",
)
# Example: insert one row, read it back, print package version.
print("registered", cid, ver)
db.insert("books", {"title": "Typra"})
print(db.get("books", "Typra"))
print(typra.__version__)

Output (the version line matches the installed wheel):

registered 1 1
{'title': 'Typra'}
0.8.0

On disk, use Database.open("app.typra") instead; registrations are persisted across process restarts for that path.

Indexed query (sketch)

# Setup: in-memory DB, indexed collection, one row.
import typra

db = typra.Database.open_in_memory()
fields = '[{"path": ["id"], "type": "int64"}, {"path": ["sku"], "type": "string"}]'
indexes = '[{"name": "sku_idx", "path": ["sku"], "kind": "index"}]'
db.register_collection("items", fields, "id", indexes)
db.insert("items", {"id": 1, "sku": "abc"})
# Example: equality query on indexed `sku`.
print(db.collection("items").where("sku", "abc").all())

Output:

[{'id': 1, 'sku': 'abc'}]

See docs/guide_python.md for and_where, limit, explain, and subset projections.

API overview

Member Description
typra.__version__ Package version (matches the Rust workspace release).
Database.open(path: str) Create or open a database file. Raises OSError if the path cannot be opened (e.g. missing parent directory, path is a directory).
db.path() -> str Path used to open the database.
db.register_collection(name, fields_json, primary_field, indexes_json=None) -> tuple[int, int] Register a new collection (schema version 1). Optional indexes_json: JSON array of {"name", "path", "kind"} objects ("unique" or "index" / "non_unique"). Returns (collection_id, schema_version). Names are trimmed; duplicates or bad JSON raise ValueError.
db.collection(name) -> Collection Query handle: where, and_where, limit, explain, all / all(fields=[...]).
db.insert(collection_name, row: dict) -> None Insert or replace the latest row (required fields + optional keys per schema).
db.get(collection_name, pk) -> dict | None Latest row or missing.
Database.open_in_memory() / Database.open_snapshot_bytes(data) / db.snapshot_bytes() In-memory DB and byte snapshots.
db.collection_names() -> list[str] All registered names, sorted alphabetically.

For behavior details (errors, edge cases, development), see the Python user guide.

fields_json (schema descriptor)

register_collection expects fields_json to be a JSON array of objects. Each object describes one field:

  • path: JSON array of strings (path segments), e.g. ["profile", "name"].
  • type: either a primitive name or a composite object.

Primitives: "bool", "int64", "uint64", "float64", "string", "bytes", "uuid", "timestamp".

Composites:

  • Optional: {"optional": <inner>}
  • List: {"list": <inner>}
  • Object: {"object": [ … same shape as top-level field objects … ]}
  • Enum: {"enum": ["a", "b"]} (variants must be strings)
  • constraints (optional): JSON array of constraint objects, e.g. {"min_i64": 0}, {"max_length": 100}, {"email": true}, {"regex": "^[a-z]+$"}.

Example (nested)

# Setup: in-memory DB and a collection whose PK uses an optional int field.
import typra

db = typra.Database.open_in_memory()
db.register_collection(
    "items",
    '[{"path": ["x"], "type": {"optional": "int64"}}]',
    "x",
)
# Example: confirm registration.
print("nested:", db.collection_names())

Output:

nested: ['items']

Example (multiple fields)

# Setup: in-memory DB and a multi-field `books` schema (PK `title`).
import typra

db = typra.Database.open_in_memory()
schema = """[
  {"path": ["title"], "type": "string"},
  {"path": ["year"], "type": "int64"},
  {"path": ["tags"], "type": {"list": "string"}}
]"""
db.register_collection("books", schema, "title")
# Example: confirm registration.
print("multi:", db.collection_names())

Output:

multi: ['books']

Exceptions

  • ValueError: invalid JSON, wrong shape, unknown type, invalid collection name, duplicate collection name, validation failures, or format/schema errors from the engine when registering.
  • OSError: I/O failures when opening the database file.
  • RuntimeError: reserved for engine “not implemented” paths (unexpected for supported API paths).

Building from source

You need Rust, Python 3.9+, and maturin. From the repo’s python/typra directory:

maturin develop --release
pytest -q

From the repository root, make check-full runs Rust + Python checks, tests, and make verify-doc-examples (validates documented command output). See also python/README.md (workspace layout for contributors).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

typra-0.8.0.tar.gz (96.6 kB view details)

Uploaded Source

Built Distributions

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

typra-0.8.0-cp39-abi3-win_arm64.whl (908.3 kB view details)

Uploaded CPython 3.9+Windows ARM64

typra-0.8.0-cp39-abi3-win_amd64.whl (974.4 kB view details)

Uploaded CPython 3.9+Windows x86-64

typra-0.8.0-cp39-abi3-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

typra-0.8.0-cp39-abi3-musllinux_1_2_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

typra-0.8.0-cp39-abi3-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

typra-0.8.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

typra-0.8.0-cp39-abi3-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

typra-0.8.0-cp39-abi3-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file typra-0.8.0.tar.gz.

File metadata

  • Download URL: typra-0.8.0.tar.gz
  • Upload date:
  • Size: 96.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for typra-0.8.0.tar.gz
Algorithm Hash digest
SHA256 477c751124ee9730239671323015a6061ecf180baf92052b471592b43e9dcdd7
MD5 da4e454bf51bf1f0aecd8555f921fc29
BLAKE2b-256 31f991edd4511495c97bcfea02e9f521fed910b41c472c43d164848479a24015

See more details on using hashes here.

File details

Details for the file typra-0.8.0-cp39-abi3-win_arm64.whl.

File metadata

  • Download URL: typra-0.8.0-cp39-abi3-win_arm64.whl
  • Upload date:
  • Size: 908.3 kB
  • Tags: CPython 3.9+, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.9

File hashes

Hashes for typra-0.8.0-cp39-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 860c9b3fcccc3eec671c5d3b96a4e553c2e467430d666a9eea4d01ce4a07c831
MD5 5db5eb7bf4ad0cee7dc6733c22f0a906
BLAKE2b-256 1f5eba525222d2c9b71ab95748adcc70a4665fc8520ed0d381be0b54c4152035

See more details on using hashes here.

File details

Details for the file typra-0.8.0-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: typra-0.8.0-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 974.4 kB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.13

File hashes

Hashes for typra-0.8.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d8450d2f9d11d2e1c06e817a4077bacd6b0633fe99494ccb09c763351d111089
MD5 929498e8711b467e2657a12483754164
BLAKE2b-256 b391e70f3cf060ece0cbabfbe0663dce96d2fd8e8de3222824bf0e2a6b2313dd

See more details on using hashes here.

File details

Details for the file typra-0.8.0-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for typra-0.8.0-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ee015bf882d28d979d76f482eca6a4fcade4dda919e28ac9b514245341e9454f
MD5 784021aaccb82c0a9658e1546efd6c52
BLAKE2b-256 97b4dad6d1c58df2c26dd32279d76e1578b986fac3b123fd755d045e7716434a

See more details on using hashes here.

File details

Details for the file typra-0.8.0-cp39-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for typra-0.8.0-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 51cae32b2d9eed6ac2790d181c7d1a410ce555e5c2f3d3bf7e4ed61bf0608827
MD5 b428eb63a75bc4259636b98e576774c9
BLAKE2b-256 1c968cbeefbe4344938f85c9eb7fc3876e6f746508c1a3e335306ddad7e4108f

See more details on using hashes here.

File details

Details for the file typra-0.8.0-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for typra-0.8.0-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f6c1b8698598a2a58fe77c6f82d3d81b40217c526dc138634afa9d3f168b9579
MD5 57a50e6248845f5cd8b2648e02c9d4f7
BLAKE2b-256 4cc4e0a1c9b97518142d37b1bc48e88bdaa58f7618fe817a030a4b1f0845e58d

See more details on using hashes here.

File details

Details for the file typra-0.8.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for typra-0.8.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 938716457a1d08a2411f059c3642655474c5abd821f9d1fb7b740b9ab861dcae
MD5 f49ef672bbc143ef8e4b6e3d4014561c
BLAKE2b-256 3c04caab09659eb3242a35556202d7aef9f1f618aff6b824e1a9d11841e55db6

See more details on using hashes here.

File details

Details for the file typra-0.8.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: typra-0.8.0-cp39-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.9+, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.14.4

File hashes

Hashes for typra-0.8.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 28930c32d13d3e79702321ec8762323fc580b7a9afaffd2e210e6ff380a89754
MD5 383489ecbbb249ae50e2c26b9b69c946
BLAKE2b-256 62d1daf87c0df0f37793039d8b73839f0730aa3fcb50b513054e0f05221f6d4f

See more details on using hashes here.

File details

Details for the file typra-0.8.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for typra-0.8.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a22b14cdea9a962a4ce3d34591ab29fc7d97de95f90e1253b28c3e974d1ca1e9
MD5 3cf8e654413e6f8ef9a06c8ecc949d29
BLAKE2b-256 53b87add6cd17aac8263c89ab813c454f8a23f224bcab21888899a083bd5bd8a

See more details on using hashes here.

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