Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

persista

CI Nightly Tests Nightly Package Tests Codecov
Documentation Documentation
Code style: black Doc style: google Ruff try/except style: tryceratops
PYPI version Python BSD-3-Clause
Downloads Monthly downloads

Overview

persista is a lightweight Python library that provides simple, consistent building blocks for persisting and caching data. It offers a uniform key-value store interface backed by multiple storage engines (in-memory, SQLite, DuckDB, LMDB, Redis, PostgreSQL) with both sync and async APIs, plus TTL caching and HTTP fetch utilities.

Quick Links:

Why persista?

Storage backends have different APIs, and switching between them (e.g. moving from an in-memory store in tests to Redis or PostgreSQL in production) usually means rewriting code. persista solves this with a single, consistent BaseStore interface:

Store and retrieve values:

>>> from persista.store import InMemoryStore
>>> with InMemoryStore() as store:
...     store.set("user:1", {"name": "Alice"})
...     store.get("user:1")
...
{'name': 'Alice'}

Swap the backend without changing the calling code:

>>> import tempfile
>>> from pathlib import Path
>>> from persista.store import SQLiteStore
>>> with tempfile.TemporaryDirectory() as tmpdir:
...     with SQLiteStore(Path(tmpdir).joinpath("data.sqlite")) as store:
...         store.set("user:1", {"name": "Alice"})
...         store.get("user:1")
...
{'name': 'Alice'}

Cache expensive calls with a TTL:

>>> from persista.cache import cached
>>> @cached(ttl=60)
... def slow_call(x: int) -> int:
...     return x**2
...
>>> slow_call(4)
16

See the documentation for detailed examples.

Features

persista provides a comprehensive set of utilities for persisting and caching data:

🗄️ Key-Value Stores

A consistent BaseStore interface for storing dict values under string keys, with both synchronous and a-prefixed asynchronous methods on every store:

  • Uniform API across backends: get/aget, get_many/aget_many, set/aset, set_many/aset_many, delete/adelete, filter/afilter, iteration
  • Backends: InMemoryStore, SQLiteStore, DuckDBStore, LmdbStore, RedisStore, PostgresStore
  • Typed variants (TypedSQLiteStore, TypedPostgresStore, ...) and pickle-backed variants (PickleLmdbStore, PickleRedisStore) for non-dict values
  • Configurable conflict handling on writes ("raise", "skip", "overwrite", "merge")

⏱️ TTL Caching

Time-to-live caching for functions and values, with sync and async variants:

  • Cache, with sync and async (a-prefixed) methods, for explicit cache instances
  • cached / async_cached decorators for caching function calls
  • A shared default cache via get_cache

🌐 HTTP Utilities

Helpers to fetch HTTP responses with automatic retries, built on top of requests or httpx:

  • fetch_response (sync, requests); get_response/post_response/put_response/ patch_response/delete_response/send_request (sync, httpx) and their _async counterparts (async, httpx)
  • HttpClient/AsyncHttpClient: class-based wrappers around httpx.Client/httpx.AsyncClient with the same retries, plus optional response caching via a Cache

🧾 Records

A Record container (a stable UUID id plus a metadata dict) with helpers to filter, sort, persist, and analyze collections of records:

  • filter_by_metadata/filter_by_metadata_range/filter_by_metadata_values, sort_by_metadata: filter and sort records by metadata
  • RecordStore and ready-to-use backends (InMemoryRecordStore, SQLiteRecordStore, DuckDBRecordStore, typed variants, ...) built on top of persista.store
  • persista.record.analysis: exact/near-duplicate detection, id-collision detection, diffing two snapshots, orphan-reference checks, schema-shape clustering, value frequency/cardinality, and metadata stats/reporting
  • generate_fake_records for synthetic test data (requires the faker extra)
>>> from persista.record import Record
>>> from persista.record.analysis import find_duplicate_record_ids
>>> records = [
...     Record(id="a", metadata={"source": "a.pdf"}),
...     Record(id="b", metadata={"source": "a.pdf"}),
...     Record(id="c", metadata={"source": "b.pdf"}),
... ]
>>> find_duplicate_record_ids(records)
[['a', 'b']]

Installation

We highly recommend installing persista in a virtual environment to avoid dependency conflicts.

uv is a fast Python package installer and resolver:

uv pip install persista

Install with specific optional dependencies:

uv pip install persista[redis,httpx]  # with Redis and httpx support

Using pip

Alternatively, you can use pip:

pip install persista

Install with specific optional dependencies:

pip install persista[redis,httpx]  # with Redis and httpx support

Requirements

  • Python: 3.10 or higher
  • Core dependencies: coola

Optional dependencies, enabled per-backend:

Extra Enables
aiosqlite Async SQLite store
duckdb DuckDB store
faker Test data generation helpers
httpx Sync/async HTTP fetch utilities
lmdb LMDB store
psycopg PostgreSQL store
redis Redis store
requests Sync HTTP fetch utilities
rich Rich-formatted output
urllib3 urllib3-based HTTP utilities

For detailed installation instructions, see the documentation.

Contributing

Contributions are welcome! We appreciate bug fixes, feature additions, documentation improvements, and more. Please check the contributing guidelines for details on:

  • Setting up the development environment
  • Code style and testing requirements
  • Submitting pull requests

Whether you're fixing a bug or proposing a new feature, please open an issue first to discuss your changes.

API Stability

⚠️ Important: As persista is under active development, its API is not yet stable and may change between releases. We recommend pinning a specific version in your project’s dependencies to ensure consistent behavior.

License

persista is licensed under BSD 3-Clause "New" or "Revised" license available in LICENSE file.

Metadata

Release files for persista 0.0.4a1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for persista 0.0.4a1
File Size Uploaded Provenance
persista-0.0.4a1.tar.gz 95.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for persista 0.0.4a1
File Interpreter ABI Platform
persista-0.0.4a1-py3-none-any.whl Python 3 none any Details

Total release size: 240.5 kB

Release files / persista-0.0.4a1.tar.gz

Download URL persista-0.0.4a1.tar.gz
Size 95.2 kB
Tags Source
SHA-256 checksum
How to use checksums
3346e278b6bda3d6a85f81141b667ee3c45ba66a30644cb545e3f0119ab719cf
BLAKE2b-256 checksum
How to use checksums
e2b39ee2fe6a6198b8321b7d514d5c447f4f549b3954b0550f5166034d61e42f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / persista-0.0.4a1-py3-none-any.whl

Download URL persista-0.0.4a1-py3-none-any.whl
Size 145.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
681ef793f5cbcf427ef78f445a64d968c19746c5e9e526f3a850f0b2a3250456
BLAKE2b-256 checksum
How to use checksums
9f075fbeee9dab58ce29c2c119537b813bcd95e0cd04619ced3d4ff206526155
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for persista 0.0.4a1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page