Skip to main content

Python bindings for CQLite - read Cassandra 5.0 SSTables locally without a cluster

Project description

cqlite-py

Python bindings for CQLite - a high-performance library for reading Apache Cassandra 5.0 SSTable files locally, without requiring a running Cassandra cluster.

Installation

pip install cqlite-py

Quick Start

import cqlite

# Open a database with schema
with cqlite.open('path/to/sstables', schema='schema.cql') as db:
    # Execute queries
    for row in db.execute('SELECT * FROM keyspace.table LIMIT 10'):
        print(row.to_dict())

Features

  • Zero cluster dependency - Read SSTable files directly from disk
  • Full CQL type support - All primitive types, collections, UDTs, and frozen types
  • Memory-efficient streaming - Iterate over large datasets without loading all rows
  • Thread-safe database handles - Safe concurrent access from multiple threads
  • Cross-platform - Linux (x86_64, ARM64), macOS (Intel, Apple Silicon), Windows

Supported Platforms

Platform Architecture Status
Linux x86_64
Linux ARM64
macOS Intel (x86_64)
macOS Apple Silicon
Windows x64

Requirements

  • Python 3.9+
  • Cassandra 5.0 SSTable files

API Reference

Opening a Database

import cqlite

# Context manager (recommended)
with cqlite.open(data_dir, schema=schema_path) as db:
    # use db...

# Manual management
db = cqlite.open(data_dir, schema=schema_path)
# use db...
db.close()

Executing Queries

# Simple query
results = db.execute('SELECT * FROM keyspace.table')
for row in results:
    print(row.to_dict())

# With LIMIT
for row in db.execute('SELECT name, age FROM users LIMIT 100'):
    print(f"{row['name']}: {row['age']}")

# Access query metadata
print(f"Rows returned: {len(results)}")
print(f"Execution time: {results.execution_time_ms}ms")
print(f"Columns: {[col.name for col in results.columns]}")

Streaming Large Results

For memory-efficient iteration over large datasets:

from cqlite import StreamingConfig

# Configure streaming for memory efficiency
config = StreamingConfig(buffer_size=512, chunk_size=1000)
for row in db.execute_streaming('SELECT * FROM large_table', config=config):
    process(row)

# Track progress
iterator = db.execute_streaming('SELECT * FROM large_table')
for row in iterator:
    if iterator.rows_received % 10000 == 0:
        print(f"Processed {iterator.rows_received} rows")

Configuration Presets

import cqlite

# Built-in presets for common use cases
config = cqlite.memory_optimized()      # 256 MB max memory
config = cqlite.performance_optimized() # 4 GB max memory

# Open database with preset configuration
db = cqlite.open('path/to/data', schema='schema.cql', config='memory_optimized')

# Validate custom configuration
custom_config = {'memory': {'max_memory': 536870912}}  # 512 MB
cqlite.validate_config(custom_config)

Error Handling

import cqlite

try:
    with cqlite.open('path/to/data', schema='schema.cql') as db:
        result = db.execute('SELECT * FROM keyspace.table')
        for row in result:
            print(row.to_dict())
except cqlite.ParseError as e:
    print(f"Query syntax error: {e}")
except cqlite.QueryError as e:
    print(f"Query execution failed: {e}")
except cqlite.SchemaError as e:
    print(f"Schema validation failed: {e}")
except IOError as e:
    print(f"File not found: {e}")
except RuntimeError as e:
    print(f"Database already closed: {e}")

Exception Hierarchy:

CqliteError (base exception)
├── SchemaError   - Schema parsing or validation failures
├── QueryError    - Query execution failures
└── ParseError    - CQL syntax errors

Built-in exceptions also used:
├── IOError       - File system errors
├── ValueError    - Invalid configuration
├── RuntimeError  - Invalid state (e.g., database closed)
└── MemoryError   - Memory allocation failures

Type Conversions

CQL types are automatically converted to Python native types:

CQL Type Python Type
text, varchar str
int, bigint, smallint, tinyint int
float, double float
boolean bool
blob bytes
timestamp datetime.datetime
date datetime.date
time datetime.time
duration datetime.timedelta
uuid, timeuuid uuid.UUID
inet ipaddress.IPv4Address or IPv6Address
decimal decimal.Decimal
varint int (arbitrary precision)
list<T> list
set<T> frozenset
map<K,V> dict
tuple<...> tuple
frozen<T> Unwrapped inner type
UDT dict with _type and _keyspace keys

Write Operations

CQLite v0.9.0 adds write support to the Python bindings. Open the database with writable=True and a write_dir to enable write operations.

import cqlite

with cqlite.open(
    'path/to/sstables',
    schema='schema.cql',
    writable=True,
    write_dir='/tmp/my-writes',
) as db:
    # Write rows via CQL INSERT, UPDATE, or DELETE
    db.execute(
        "INSERT INTO test_basic.simple_table (id, name, age) "
        "VALUES (11111111-1111-1111-1111-111111111111, 'Alice', 30)"
    )
    db.execute(
        "UPDATE test_basic.simple_table SET age = 31 "
        "WHERE id = 11111111-1111-1111-1111-111111111111"
    )

    # Flush the in-memory write buffer (memtable) to an SSTable on disk.
    # Returns the path to the flushed Data.db file.
    path = db.flush_run()
    print(f'Flushed to: {path}')

    # Run background compaction within a time budget
    report = db.maintenance_step(budget_ms=100)
    print(f'Merged {report.rows_merged} rows in {report.time_spent_ms:.1f} ms')
    if report.pending_compaction:
        print('More compaction work available')

    # Inspect write statistics
    stats = db.write_stats
    print(f'Memtable size: {stats.memtable_size_bytes} bytes')
    print(f'Total flushed: {stats.total_written_bytes} bytes')

Write API

Method / Property Description
db.execute(cql) Execute a CQL INSERT, UPDATE, or DELETE statement
db.flush_run() Flush memtable to SSTable; returns the Data.db path or "" if memtable was empty
db.maintenance_step(budget_ms) Run STCS compaction for up to budget_ms milliseconds; returns MaintenanceReport
db.write_stats WriteStats property: memtable_size_bytes, memtable_row_count, total_written_bytes, l0_sstable_count

Known Limitations

  • Counter columns cannot be written — execute() raises CqliteError for counter mutations.
  • Concurrent queries on the same handle may need a warm-up query first (Issue #311).

See docs/write-support-limitations.md for the full limitations reference.

Resources

License

MIT OR Apache-2.0

Links

Project details


Download files

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

Source Distribution

cqlite_py-0.10.0.tar.gz (1.4 MB view details)

Uploaded Source

Built Distributions

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

cqlite_py-0.10.0-cp39-abi3-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.9+Windows x86-64

cqlite_py-0.10.0-cp39-abi3-manylinux_2_28_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

cqlite_py-0.10.0-cp39-abi3-manylinux_2_28_aarch64.whl (2.2 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

cqlite_py-0.10.0-cp39-abi3-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

cqlite_py-0.10.0-cp39-abi3-macosx_10_12_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file cqlite_py-0.10.0.tar.gz.

File metadata

  • Download URL: cqlite_py-0.10.0.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cqlite_py-0.10.0.tar.gz
Algorithm Hash digest
SHA256 1fdea0a3e3ed42a236de6c707939660d02819fcc309bda3042630007a209f52c
MD5 b6be7b1ab36584407c60abf5921bade7
BLAKE2b-256 1d1e659d5db55d8a2c7a3c8c573c9ed139c1e15963b20f7cee07198aac82947b

See more details on using hashes here.

Provenance

The following attestation bundles were made for cqlite_py-0.10.0.tar.gz:

Publisher: python-release.yml on pmcfadin/cqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cqlite_py-0.10.0-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: cqlite_py-0.10.0-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cqlite_py-0.10.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 7dbea5359246c666e0de87832b790d2c32199d1fa662d04cef713630e765e1c5
MD5 eb4255cb872bc3bf6f3b2424018d7f14
BLAKE2b-256 459e2d1636ba3677ec66c68772fba00ffdc6e7ac3bf0e4ef211ed20c8e6aa332

See more details on using hashes here.

Provenance

The following attestation bundles were made for cqlite_py-0.10.0-cp39-abi3-win_amd64.whl:

Publisher: python-release.yml on pmcfadin/cqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cqlite_py-0.10.0-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cqlite_py-0.10.0-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e08eead38560d29c2bda8030141b0f0d23898507099f7f4075ffe6d38ad9de01
MD5 a3075058f75773e0c7eff22663a3a18f
BLAKE2b-256 ca695b4e45c2cd6aa34db3d3084ed513a7a29340ff615a4edacbbd627a41cf59

See more details on using hashes here.

Provenance

The following attestation bundles were made for cqlite_py-0.10.0-cp39-abi3-manylinux_2_28_x86_64.whl:

Publisher: python-release.yml on pmcfadin/cqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cqlite_py-0.10.0-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cqlite_py-0.10.0-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 134f25f8cae4da0b556fe4315cd88e19adf0ea041c0fbb7a9796496e3ceb3ea4
MD5 a205cb4de0cc960d2e1c1e60184463ad
BLAKE2b-256 a17a4a7b823311f4c0af154624385e06cf3f6ffeaa556e5c91048e5b42fa5be2

See more details on using hashes here.

Provenance

The following attestation bundles were made for cqlite_py-0.10.0-cp39-abi3-manylinux_2_28_aarch64.whl:

Publisher: python-release.yml on pmcfadin/cqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cqlite_py-0.10.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cqlite_py-0.10.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 54e16f2c2671df403fc68c467df22912db87f8ea58873ca48e81f1c781c77b88
MD5 ed1f98ff8f126b93dd5f06570a6c0678
BLAKE2b-256 331224a461b753cf2b5bef1ae82ae0e508b8a2a1c3dedd3e207ff05d8608c051

See more details on using hashes here.

Provenance

The following attestation bundles were made for cqlite_py-0.10.0-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: python-release.yml on pmcfadin/cqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cqlite_py-0.10.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for cqlite_py-0.10.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f189aaac16cc3ecbd9a53b76614d745ccfc0801dcd2c11f8e5ecdf8a37ef7124
MD5 f6c41fcfa216474a8a5a066177e390e9
BLAKE2b-256 d69218bfd266cdd5091be9fb937159c93ef3a1082b7c8b8ece33f1b8409c4414

See more details on using hashes here.

Provenance

The following attestation bundles were made for cqlite_py-0.10.0-cp39-abi3-macosx_10_12_x86_64.whl:

Publisher: python-release.yml on pmcfadin/cqlite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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