Skip to main content

Python SDK for Kimberlite database

Project description

Kimberlite Python SDK

Status: 🚧 In Progress (Phase 11.2)

Pythonic client library for Kimberlite database.

Installation

pip install kimberlite

Quick Start

Stream Operations

from kimberlite import Client, DataClass

# Connect with context manager
with Client.connect(
    addresses=["localhost:5432"],
    tenant_id=1,
    auth_token="secret"
) as client:
    # Create stream
    stream_id = client.create_stream("events", DataClass.PHI)

    # Append events
    events = [b"event1", b"event2", b"event3"]
    offset = client.append(stream_id, events)

    # Read events
    results = client.read(stream_id, from_offset=0, max_bytes=1024)
    for event in results:
        print(f"Offset {event.offset}: {event.data}")

SQL Queries

from kimberlite import Client, Value

with Client.connect(addresses=["localhost:5432"], tenant_id=1) as client:
    # Create table
    client.execute("""
        CREATE TABLE users (
            id BIGINT PRIMARY KEY,
            name TEXT,
            email TEXT,
            active BOOLEAN,
            created_at TIMESTAMP
        )
    """)

    # Insert data with parameterized queries
    client.execute(
        "INSERT INTO users (id, name, email, active, created_at) VALUES ($1, $2, $3, $4, $5)",
        [
            Value.bigint(1),
            Value.text("Alice"),
            Value.text("alice@example.com"),
            Value.boolean(True),
            Value.timestamp(1609459200_000_000_000)  # 2021-01-01 UTC
        ]
    )

    # Query data
    result = client.query(
        "SELECT * FROM users WHERE active = $1",
        [Value.boolean(True)]
    )

    for row in result.rows:
        id_val = row[result.columns.index('id')]
        name_val = row[result.columns.index('name')]
        print(f"User {id_val.data}: {name_val.data}")

    # Point-in-time query (compliance audit)
    from kimberlite.types import Offset
    historical_offset = Offset(1000)
    historical_result = client.query_at(
        "SELECT COUNT(*) FROM users",
        [],
        historical_offset
    )

Features

Stream Operations

  • Create and manage event streams
  • Append events with automatic batching
  • Read events with offset-based pagination
  • Type hints for IDE autocomplete

SQL Query Engine

  • Core SQL: SELECT (aggregates, GROUP BY/HAVING, UNION, INNER/LEFT JOIN, CTEs, subqueries, window functions), INSERT, UPDATE, DELETE, DDL
  • Parameterized queries with type-safe Value objects
  • Point-in-time queries (AT OFFSET) for compliance audits; AS OF TIMESTAMP planned v0.6
  • All SQL types: NULL, BIGINT, TEXT, BOOLEAN, TIMESTAMP

Python Integration

  • Context managers for automatic resource cleanup
  • Type hints and mypy strict mode support
  • Rich exception hierarchy for error handling
  • Pythonic API design

Compliance Features

  • Query historical state at any log position
  • Immutable audit trail
  • Data classification (PHI, Non-PHI, De-identified)

Usage Examples

Working with Value Types

from kimberlite import Value
from datetime import datetime

# Create values
null_val = Value.null()
int_val = Value.bigint(42)
text_val = Value.text("Hello, 世界!")
bool_val = Value.boolean(True)
ts_val = Value.timestamp(1609459200_000_000_000)

# From Python datetime
dt = datetime(2024, 1, 1, 12, 0, 0)
ts_from_dt = Value.from_datetime(dt)

# Convert timestamp back to datetime
dt_back = ts_val.to_datetime()
print(dt_back.isoformat())  # "2021-01-01T00:00:00"

CRUD Operations

# CREATE
client.execute("""
    CREATE TABLE products (
        id BIGINT PRIMARY KEY,
        name TEXT,
        price BIGINT,
        in_stock BOOLEAN
    )
""")

# INSERT
client.execute(
    "INSERT INTO products (id, name, price, in_stock) VALUES ($1, $2, $3, $4)",
    [Value.bigint(1), Value.text("Widget"), Value.bigint(1999), Value.boolean(True)]
)

# UPDATE
client.execute(
    "UPDATE products SET price = $1 WHERE id = $2",
    [Value.bigint(2499), Value.bigint(1)]
)

# DELETE
client.execute(
    "DELETE FROM products WHERE id = $1",
    [Value.bigint(1)]
)

# SELECT
result = client.query("SELECT * FROM products WHERE in_stock = $1", [Value.boolean(True)])
for row in result.rows:
    print(row)

Compliance Audit Example

from kimberlite.types import Offset

# Record initial state
checkpoint_offset = Offset(client.log_position())  # Hypothetical API

# Make changes
client.execute("UPDATE users SET email = $1 WHERE id = $2", [
    Value.text("newemail@example.com"),
    Value.bigint(1)
])

# Later: Audit what the state was at checkpoint
historical_result = client.query_at(
    "SELECT email FROM users WHERE id = $1",
    [Value.bigint(1)],
    checkpoint_offset
)
# Returns the old email, proving what the state was at that point in time

Documentation

Installation (Development)

# Build FFI library
cd ../../
cargo build -p kimberlite-ffi

# Install Python SDK in development mode
cd sdks/python
pip install -e .

Development Status

SDK Implementation:

  • ctypes-based FFI wrapper
  • Stream operations (create, append, read)
  • SQL query engine (SELECT, INSERT, UPDATE, DELETE, DDL)
  • Parameterized queries with Value types
  • Point-in-time queries (query_at)
  • Type hints and mypy strict mode
  • Comprehensive unit tests (48+ tests for values, 5+ for queries)
  • Integration tests
  • Wheel distribution with bundled binaries
  • PyPI publishing

Value Type System:

  • NULL, BIGINT, TEXT, BOOLEAN, TIMESTAMP
  • DateTime conversion helpers
  • Equality and hashing support
  • Type-safe constructors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

kimberlite-0.6.1-py3-none-win_amd64.whl (371.1 kB view details)

Uploaded Python 3Windows x86-64

kimberlite-0.6.1-py3-none-manylinux_2_17_x86_64.whl (511.3 kB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

kimberlite-0.6.1-py3-none-macosx_11_0_arm64.whl (464.2 kB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file kimberlite-0.6.1-py3-none-win_amd64.whl.

File metadata

  • Download URL: kimberlite-0.6.1-py3-none-win_amd64.whl
  • Upload date:
  • Size: 371.1 kB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for kimberlite-0.6.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 1ab4ed4f6c99a61589f79a5d88a6bdf9035cfe7f2c277501e300e156033b7403
MD5 26147d66f9e9df44ec6ec6b90ec2fa8c
BLAKE2b-256 4f8fd8744780984715ebc8b9c21df845c894c78553c98db0340ce6d90f9733e5

See more details on using hashes here.

File details

Details for the file kimberlite-0.6.1-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for kimberlite-0.6.1-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d36e18f7fbc988f7feb1484b937fd4afe6f3f1209556418e09aab88f4bb3d42d
MD5 08be9b7683044dc0768b6ef96d60a24b
BLAKE2b-256 60b4e5ab4fcc98a9b4ae07aaeef6af3e19dfe2b7d915f1999ff6bf93d8b2e16a

See more details on using hashes here.

File details

Details for the file kimberlite-0.6.1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for kimberlite-0.6.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f57e572f1ecb2c5ce6a75e86bc9688072dc321a42346c92ed12114ac8cc19a69
MD5 ff2fcfa1c525c80593b442450c02ef92
BLAKE2b-256 7a4ae1693b07cfd58cafbfbe7756016401f0f8c565386d19603be334585e3e9f

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