FerrumDB Python Bindings
FerrumDB is a zero-setup embedded document database for Python, powered by Rust.
- Zero-setup — no server, no config, just
open() - Rust-speed — AOF writes, in-memory index for O(1) reads
- AES-256 Encrypted — optional encryption at rest
- Native JSON — store any structured document
- Secondary Indexing — query by JSON fields
- TTL Support — keys auto-expire after a configurable duration
- Built-in Dashboard — launch Ferrum Studio from your app
Installation
From PyPI (recommended)
pip install ferrumdb
From source (requires Rust toolchain + maturin)
pip install maturin
git clone https://github.com/MuhammadUsmanGM/FerrumDB.git
cd FerrumDB/ferrumdb-python
maturin develop --release
Quick Start
from ferrumdb import FerrumDB, Transaction
# Zero-setup: creates myapp.db if it doesn't exist
db = FerrumDB.open("myapp.db")
# Store any JSON-serializable value
db.set("user:1", {"name": "alice", "role": "admin", "score": 99})
db.set("user:2", {"name": "bob", "role": "user", "score": 45})
# TTL — auto-expires after 60 seconds
db.set_ex("session:abc", {"token": "xyz"}, 60)
# Read back (returns native Python dict!)
user = db.get("user:1")
print(user) # {'name': 'alice', 'role': 'admin', 'score': 99}
print(db.count()) # 2
print(db.keys()) # ['user:1', 'user:2']
# Key existence check (O(1), no disk read)
if db.exists("user:1"):
print("User exists!")
# Prefix scanning
user_keys = db.keys_with_prefix("user:")
print(user_keys) # ['user:1', 'user:2']
# Database statistics
stats = db.stats()
print(f"Keys: {stats['key_count']}, Disk: {stats['disk_size_bytes']} bytes")
# Delete
db.delete("user:2")
Encryption
Open a database with AES-256-GCM encryption at rest:
db = FerrumDB.open("secure.db", encryption_key="my_super_secret_key_32_bytes_!!?")
db.set("secret", {"classified": True})
The key must be exactly 32 characters.
Secondary Indexing
Query by JSON field values in O(1) time:
db = FerrumDB.open("myapp.db")
db.set("user:1", {"name": "alice", "role": "admin"})
db.set("user:2", {"name": "bob", "role": "user"})
db.set("user:3", {"name": "charlie", "role": "admin"})
db.create_index("role")
admins = db.find("role", '"admin"')
print(admins) # ["user:1", "user:3"]
Transactions
tx = Transaction()
tx.set("key1", {"value": 1})
tx.set_ex("cache:temp", {"data": 123}, 300) # TTL in transactions too
tx.delete("old_key")
db.commit(tx) # all-or-nothing
Ferrum Studio (Web Dashboard)
Launch the built-in web dashboard directly from your app:
db = FerrumDB.open("myapp.db")
db.start_studio(7474) # http://localhost:7474
Browse keys, inspect values, set/delete entries, and view real-time metrics — no extra tools needed.
API Reference
| Method | Description |
|---|---|
FerrumDB.open(path, encryption_key=None) |
Open/create database. Optional AES-256 encryption. |
db.set(key, value) |
Store any JSON-serializable value |
db.set_ex(key, value, ttl_seconds) |
Store with TTL (auto-expires) |
db.get(key) |
Retrieve value (returns native Python dict/None) |
db.delete(key) |
Delete a key (returns True if existed) |
db.keys() |
List all keys |
db.keys_with_prefix(prefix) |
List keys starting with prefix |
db.count() |
Total number of entries |
db.exists(key) |
Check if key exists (O(1), no disk read) |
db.stats() |
Get database statistics (dict with key_count, disk_size_bytes, etc.) |
db.create_index(field) |
Build secondary index on JSON field |
db.find(field, value) |
Query by indexed field (value as JSON string) |
db.commit(tx) |
Commit an atomic transaction |
db.export_json() |
Export all key-value pairs as list of tuples |
db.import_json(entries) |
Import key-value pairs from list of tuples |
db.start_studio(port=7474) |
Launch Ferrum Studio dashboard |
Transaction
| Method | Description |
|---|---|
Transaction() |
Create a new transaction |
tx.set(key, value) |
Stage a SET operation |
tx.set_ex(key, value, ttl_seconds) |
Stage a SET with TTL |
tx.delete(key) |
Stage a DELETE operation |
Limitations
- Entire index in RAM — Best for databases <1GB
- Single-writer only — One process per database file
- No range queries — Only exact value matches on indexed fields
- No nested field indexes — Only top-level JSON fields supported
What's New in v0.2.0
- Native Python dicts —
get()now returns Python dicts instead of JSON strings - CRC32 checksums — Early corruption detection with clear error messages
- Encrypted file caching — O(1) reads after first access (was O(n) on every read)
- New API methods:
exists(),stats(),keys_with_prefix(),export_json(),import_json() - Auto-compaction — Automatic dead data cleanup when threshold is exceeded
See GitHub for full documentation.
License
MIT — See LICENSE for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
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 ferrumdb-0.2.1-cp312-cp312-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: ferrumdb-0.2.1-cp312-cp312-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8f012a441e47e572ef6edd2b08a29e3915c3bfb51e67ed2306bab751b6d25b86
|
|
| MD5 |
7e3efcc2d2bc2340ca4d4c3612a79ba2
|
|
| BLAKE2b-256 |
37c30a93431e0a2af891ced7746b064407134f4d713c939a43c62aeaeda358ab
|
File details
Details for the file ferrumdb-0.2.1-cp311-cp311-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: ferrumdb-0.2.1-cp311-cp311-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
965e3965835196c1930c7952c1e5a536173027ccd7c1108964a9aa44a79cd585
|
|
| MD5 |
ae7d11d9b97d340ff53be24f4fc57119
|
|
| BLAKE2b-256 |
2688f27cdd2df948713762df8e8ec5dc13e6c4d23c8f9d5040cec331a5753549
|
File details
Details for the file ferrumdb-0.2.1-cp310-cp310-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: ferrumdb-0.2.1-cp310-cp310-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.10, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f23874e159a36cd670c2c80e787c1337d271b3e72e90eb61276c97377afdf13c
|
|
| MD5 |
1812e3a7b351a365f90ed55eb9c85a75
|
|
| BLAKE2b-256 |
b29ebbd72a55c1875b5decd05b75b80a04f86e0fbbe81938b1e863b3676c5028
|
File details
Details for the file ferrumdb-0.2.1-cp39-cp39-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: ferrumdb-0.2.1-cp39-cp39-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.9, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3802325b1da5ca1cf11022617eb9a871240ae26e3e8e9106ebf38dd9656c1f59
|
|
| MD5 |
2a239c579dd564a96d4cdf0bfd6c6bf4
|
|
| BLAKE2b-256 |
b09fdcc3f1a9235cc83cef001247aaf57c2d3060187a08ee8fd810a5d86c541b
|
File details
Details for the file ferrumdb-0.2.1-cp38-cp38-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: ferrumdb-0.2.1-cp38-cp38-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.8, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc457895b006bf5169848f1c2856dc92d5020cd5db3770e0929c80bb5a391a45
|
|
| MD5 |
854d454f4b4b17f8dec8db3661d266b7
|
|
| BLAKE2b-256 |
94a1b3afda0f177dc8c8c8ab650519f99fd82c0ce385ef98a8887aad292e1e59
|