Skip to content

crossbario/zlmdb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

zLMDB

PyPI Python CI CD (wheels) CD (wheels-arm64) CD (wheels-docker) Docs License Downloads


zlmdb is a complete LMDB solution for Python providing two APIs in one package:

  1. Low-level py-lmdb compatible API - Direct LMDB access with full control
  2. High-level object-relational API - Type-safe ORM with automatic serialization

Key Features

Low-level LMDB API (py-lmdb compatible):

  • Drop-in replacement for py-lmdb
  • Direct access to LMDB transactions, cursors, and databases
  • Full LMDB feature set (subdatabases, duplicate keys, etc.)
  • Works with all py-lmdb examples and code

High-level Object-Relational API:

  • Type-safe persistent objects with automatic serialization
  • Multiple serializers (JSON, CBOR, Pickle, Flatbuffers)
  • Export/import from/to Apache Arrow
  • Native Numpy arrays and Pandas data frames support
  • Automatic indexes and relationships
  • Schema management

Implementation:

  • CFFI-only (no CPyExt) for maximum compatibility
  • Works on both CPython and PyPy
  • Native binary wheels for x86-64 and ARM64
  • Vendored LMDB (no external dependencies)
  • High-performance with zero-copy operations
  • Free software (MIT license)

Usage Examples

Low-level API (py-lmdb compatible):

import zlmdb.lmdb as lmdb

# Open database
env = lmdb.open('/tmp/mydb', max_dbs=10)
db = env.open_db(b'users')

# Write data
with env.begin(write=True) as txn:
    txn.put(b'alice', b'[email protected]', db=db)
    txn.put(b'bob', b'[email protected]', db=db)

# Read data
with env.begin() as txn:
    email = txn.get(b'alice', db=db)
    print(email)  # b'[email protected]'

High-level API (zlmdb ORM):

import zlmdb

# Define schema
class User(object):
    def __init__(self, oid, name, email):
        self.oid = oid
        self.name = name
        self.email = email

schema = zlmdb.Schema()
schema.users = zlmdb.MapUuidCbor(1, marshal=lambda obj: obj.__dict__)

# Use it
db = zlmdb.Database('/tmp/mydb', schema=schema)
with db.begin(write=True) as txn:
    user = User(uuid.uuid4(), 'Alice', '[email protected]')
    schema.users[txn, user.oid] = user

Development Workflow

This project uses just as a modern task runner and uv for fast Python package management.

Complete Recipe List

Virtual Environment Management:

  • just create [venv] - Create Python venv (auto-detects system Python if no arg)
  • just create-all - Create all venvs (cpy314, cpy313, cpy312, cpy311, pypy311)
  • just version [venv] - Show Python version
  • just list-all - List all available Python runtimes

Installation:

  • just install [venv] - Install zlmdb (runtime deps only)
  • just install-dev [venv] - Install in editable mode
  • just install-tools [venv] - Install dev tools (pytest, sphinx, etc.)
  • just install-all - Install in all venvs

Testing - LMDB: 🧪

  • just test-examples-lmdb - Test all LMDB examples (in default venv)
  • just test-examples-lmdb-addressbook [venv] - Test example LMDB address book
  • just test-examples-lmdb-dirtybench [venv] - Test example LMDB dirtybench
  • just test-examples-lmdb-dirtybench-gdbm [venv] - Test example LMDB dirtybench-gdbm
  • just test-examples-lmdb-nastybench [venv] - Test example LMDB nastybench
  • just test-examples-lmdb-parabench [venv] - Test example LMDB parabench

Testing - ORM: 🧪

  • just test [venv] - Run full test suite (both test directories)
  • just test-quick [venv] - Quick pytest run
  • just test-single [venv] - Run test_basic.py
  • just test-pmaps [venv] - Run pmap tests
  • just test-indexes [venv] - Run index tests
  • just test-select [venv] - Run select tests
  • just test-zdb-etcd/df/dyn/fbs [venv] - Individual zdb tests
  • just test-zdb [venv] - All zdb tests
  • just test-all - Test in all venvs
  • just coverage [venv] - Generate HTML coverage report

Code Quality:

  • just autoformat [venv] - Auto-format code with Ruff (modifies files!)
  • just check-format [venv] - Check formatting with Ruff (dry run)
  • just check-typing [venv] - Run static type checking with mypy

Building: 📦

  • just build [venv] - Build wheel
  • just build-sourcedist [venv] - Build sdist
  • just build-all - Build wheels for all venvs
  • [!] just dist [venv] - Build both sdist and wheels
  • just verify-wheels [venv] - Verify all built wheels.

Publishing: 🚀

  • just publish [venv] - Upload to PyPI with twine

Documentation: 📚

  • just docs [venv] - Build HTML docs with Sphinx
  • just docs-view [venv] - Build and open in browser
  • just docs-clean - Clean doc build artifacts

Cleaning: 🧹

  • just clean - Clean everything (alias for distclean)
  • just clean-build - Remove build/ dist/ *.egg-info
  • just clean-pyc - Remove *.pyc __pycache__
  • just clean-test - Remove .coverage .pytest_cache
  • just distclean - Nuclear clean (removes venvs too!)

Utilities: 🔧

  • just update-flatbuffers - Update from deps/ submodule
  • just generate-flatbuffers-reflection - Generate reflection code
  • just fix-copyright - Update copyright headers
  • just setup-completion - Setup bash tab completion

Quick Start

# Install just and uv (if not already installed)
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash
curl -LsSf https://astral.sh/uv/install.sh | sh

# Create virtual environment and install in development mode
just create
just install-dev

# Run tests
just test

# Build wheel
just build

About

Object-relational in-memory database layer based on LMDB

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages