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. Typra also ships an experimental, read-only DB-API 2.0 adapter (typra.dbapi) with a minimal SELECT subset—see the Python guide.

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.12.0,<0.13"

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.12.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.12.0.tar.gz (120.3 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.12.0-cp39-abi3-win_arm64.whl (1.0 MB view details)

Uploaded CPython 3.9+Windows ARM64

typra-0.12.0-cp39-abi3-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.9+Windows x86-64

typra-0.12.0-cp39-abi3-musllinux_1_2_x86_64.whl (1.3 MB view details)

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

typra-0.12.0-cp39-abi3-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

typra-0.12.0-cp39-abi3-manylinux_2_28_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

typra-0.12.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

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

typra-0.12.0-cp39-abi3-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

typra-0.12.0-cp39-abi3-macosx_10_12_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for typra-0.12.0.tar.gz
Algorithm Hash digest
SHA256 945924fccfe8c00644f901b46eb83ca7d9f56023a0b36ef1219b64a964cc01e0
MD5 e23833887f19a1e413856d1869cc3281
BLAKE2b-256 e8cdc729d43486c9dd69fc87357feffd67d78b2ce57e9bfcaa68bb3939cfb314

See more details on using hashes here.

File details

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

File metadata

  • Download URL: typra-0.12.0-cp39-abi3-win_arm64.whl
  • Upload date:
  • Size: 1.0 MB
  • 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.12.0-cp39-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 b9dab651e82a9b367defaa6f20a4c3de9cb4d2aa54a568d019a7de92e69442b8
MD5 bfed8600fbf857d6d8156d60907d131d
BLAKE2b-256 576cbdf2a1fac77c1ad08f799024cea5a864493e35a39d9b69c8a9d5dea91fcc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: typra-0.12.0-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.12.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 77317984cb92be6c371d673b6a49b522430580f166b02c61a03e893d0ad894ef
MD5 5431756888646a039645c52c35fb22e5
BLAKE2b-256 9033393bb62692fc1912c0803f48bbc9ab1e0098338c05aaac4fa2e61788aaa3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for typra-0.12.0-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ce962fd472c506efd863d47a92e2f49faa9ba68237130530fd80baa2018b2b54
MD5 16973f897b6a2faf513ac83e06087e32
BLAKE2b-256 d7e27a925871c4ae405f14d70d624f6190723378f2e4bd4c1c3a71500abaf732

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for typra-0.12.0-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 28dede4049365e53c8ee9a214c2fb0c0f803fe2ddb476ad306d41857cf00e849
MD5 7f5cc2c79a7f05c467b3cd44a5de3b09
BLAKE2b-256 2b7642b56f20111556f4ad14d95170ad1300be0c41fe2988a3b09ab30f86debf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for typra-0.12.0-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cd18d93939124e000b1a059a3f6b8a637c95a8f8a37d04d9025903cfe29a71aa
MD5 11978b3c0d728d83d4c741670f42438d
BLAKE2b-256 6a6586afa187c8070cdf1af3bf8f1c3dd74244e0944ef9a679493c7e30f1f515

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for typra-0.12.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ffec5e2710d8e6949dc1bb283a456dc5e659b32619f79efecae104d0d31bd6ea
MD5 79a073bab650a0ecbf4be96098702736
BLAKE2b-256 a3d89e61488c6637a603a08230bdd8f95c9dcaf3a98d7e7387d05aefc89f11c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for typra-0.12.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c8d64ce9d0b70fd7cde1db54c90dc110b7e030f84141595190b6a6972af1254f
MD5 4932be7b14e1e7b8703f6d9e94ff513f
BLAKE2b-256 ae571cb3c449e6b85f3624c0d8814283454fc68110f9493c3b1972bf0dd9cf4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for typra-0.12.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9dcc04c9ce4c138154ef03ebcb3a5de2d5dd2ef0b25611ef1bad796faa857b91
MD5 6fb2cb140d227482fc5217e0cce70c14
BLAKE2b-256 0268bda701578f1272ad3e719fc90cc0610541982a767337f478beab093afe29

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