Metadata-Version: 2.5
Name: rhizodat
Version: 0.1.0
Summary: Bitemporal polyglot data layer over PostgreSQL, ClickHouse, drevo and Apache Iceberg
Project-URL: Repository, https://github.com/ice1x/rhizodat
Author: ice1x
License-Expression: Apache-2.0
License-File: LICENSE
Keywords: bitemporal,clickhouse,database,graph,iceberg,postgresql,transactions
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Database
Classifier: Typing :: Typed
Requires-Python: >=3.12
Provides-Extra: clickhouse
Requires-Dist: clickhouse-connect>=0.8; extra == 'clickhouse'
Provides-Extra: drevo
Requires-Dist: neo4j>=5.20; extra == 'drevo'
Provides-Extra: iceberg
Requires-Dist: pyiceberg[pyarrow,sql-sqlite]>=0.12; extra == 'iceberg'
Provides-Extra: ingest
Requires-Dist: pyarrow>=17; extra == 'ingest'
Requires-Dist: rdflib>=7; extra == 'ingest'
Provides-Extra: mcp
Requires-Dist: mcp>=2.3; extra == 'mcp'
Provides-Extra: native
Requires-Dist: rhizodat-native==0.1.0; extra == 'native'
Provides-Extra: postgres
Requires-Dist: psycopg[binary]>=3.2; extra == 'postgres'
Provides-Extra: testing
Requires-Dist: faker>=30; extra == 'testing'
Requires-Dist: pytest>=8; extra == 'testing'
Description-Content-Type: text/markdown

# rhizodat 🍄

**A bitemporal polyglot data layer:** PostgreSQL, ClickHouse,
[drevo](https://github.com/ice1x/drevo) and Apache Iceberg behave like one
transactional store. An entity may span several stores; every write is one
atomic meta-transaction across them, and every version is kept, so any entity
can be read as of any moment.

```bash
pip install 'rhizodat[postgres,clickhouse,drevo,iceberg]'
```

```python
from rhizodat import Rhizodat, entity


@entity(stores={"pg": ["status", "amount"], "graph": ["customer"]}, name="shop.Order")
class Order:
    status: str
    amount: Decimal
    customer: str


with Rhizodat(stores={"pg": PG, "graph": GRAPH}, journal=JOURNAL) as dat:
    orders = dat.repository(Order)
    orders.add(order)  # one meta-transaction across PostgreSQL and drevo
    print(orders.get(order.dat_id, as_of=before).status)  # new
```

The whole script: [examples/quickstart.py](examples/quickstart.py). More in
[examples/](examples/) and the
[documentation](https://ice1x.github.io/rhizodat/): concepts, guides
(Repository, migrations, file imports, MCP), adapters and the API reference.

Apache-2.0. Status: 0.1.0, the MVP — please report what you tried in a
[feedback issue](https://github.com/ice1x/rhizodat/issues/new?template=feedback.yml).
