Skip to main content

Python client library for StreamCI

Project description

PyStreamCI

Python client library for StreamCI — a connector-style API in the spirit of database drivers.

Installation

pip install pystreamci
# or editable install for development
pip install -e clients/python/

Quick Start

from pathlib import Path
import pystreamci

# Secret-key auth (recommended) — use as context manager
with pystreamci.connect("https://api.streamci.org",
                        target="my_sensors",
                        secret_key="...") as client:

    # Insert a document
    client.insert({"time": {"$date": "2025-08-04T10:00:00Z"}, "val": 42})

    # Insert many documents (auto-batched)
    client.insert_many(records, batch_size=1000)

    # Upload an NDJSON/CSV file
    client.insert_file("data.ndjson")

    # Query (returns list of dicts)
    docs = client.query({"val": {"$gte": 10}}, sort={"time": 1}, limit=50)

    # Stream large results with an iterator
    for doc in client.query_iter({"val": {"$gte": 0}}):
        process(doc)

    # Download a blob field
    blob = client.query_blob(document_id="67abc...", field="image1")

    # Download blob fields from multiple documents
    blobs = client.query_blobs_by_field(["67abc...", "89def..."], field="image1")

    # Download all blob fields from a single document
    all_blobs = client.query_blobs_by_doc(document_id="67abc...")

    # Insert with blob attachment — flexible formats accepted
    client.insert({"name": "doc"}, blobs={"photo": "/path/to/photo.jpg"})     # file path
    client.insert({"name": "doc"}, blobs={"photo": Path("photo.jpg")})        # Path object
    with open("photo.jpg", "rb") as f:
        client.insert({"name": "doc"}, blobs={"photo": f})                    # file object
        client.insert({"name": "doc"}, blobs={"photo": ("photo.jpg", f)})     # 2-tuple
        client.insert({"name": "doc"}, blobs={"photo": ("photo.jpg", f, "image/jpeg")})  # 3-tuple

    # Update and delete
    client.update({"val": 42}, {"val": 43})
    client.delete({"val": 43})

# Password auth
client = pystreamci.connect("https://api.streamci.org",
                            target="my_sensors",
                            username="user1", password="pass123")

API Reference

pystreamci.connect(host, target, *, secret_key=None, username=None, password=None, max_retries=3, timeout=30.0, log_level="WARNING", log_file=None)

Returns a StreamCIClient. Auth type is inferred from the provided credentials.

StreamCIClient

Method Description
insert(data, blobs=None) Insert a single document (with optional blob attachments)
insert_many(data, datatype, batch_size) Batch insert (auto-splits at batch_size)
insert_file(file_path, datatype) Upload NDJSON/CSV file
update(filter, data, blobs=None) Update matching documents
delete(filter) Delete matching documents
query(query, *, project, sort, limit) Query and return list
query_iter(query, *, project, sort, limit) Query with streaming iterator
query_blob(document_id, field) Download blob field as bytes
query_blobs_by_field(document_ids, field) Download blob field from multiple documents
query_blobs_by_doc(document_id, *, ignore_errors) Download all blob fields from a document (including nested blob fields); returns dot-notation keys

pystreamci.make_date(dt)

Convert a datetime or ISO-8601 string to a StreamCI {"$date": "..."} object.

pystreamci.make_date("2025-08-04T10:00:00Z")
pystreamci.make_date(datetime(2025, 8, 4, 10, 0, tzinfo=timezone.utc))

Exceptions

Exception When raised
StreamCIConnectionError Connection failed after retries
StreamCIAuthError Authentication/authorization error (subclass of StreamCIRequestError)
StreamCIRequestError Server returned status=0
StreamCIParseError Response parsing failed
StreamCITimeoutError Request timed out
StreamCIValidationError Invalid client-side input

query() vs query_iter()

Method Returns Use when
query(...) list[Document] Result fits in memory; need random access
query_iter(...) Iterator[Document] Large result sets; process one doc at a time

query_iter() uses HTTP streaming (stream=True) and parses NDJSON line-by-line, keeping memory usage constant regardless of result size.

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

pystreamci-0.4.1.tar.gz (13.3 kB view details)

Uploaded Source

Built Distribution

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

pystreamci-0.4.1-py3-none-any.whl (16.7 kB view details)

Uploaded Python 3

File details

Details for the file pystreamci-0.4.1.tar.gz.

File metadata

  • Download URL: pystreamci-0.4.1.tar.gz
  • Upload date:
  • Size: 13.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for pystreamci-0.4.1.tar.gz
Algorithm Hash digest
SHA256 37d44e4e477f6a474e2c1983d2ff6f251948454105c12a4da9dcc1cc069c7aae
MD5 3e04facc928966ce8f56e8f02ebd1497
BLAKE2b-256 df0372b5dc3567aafe5443aae40d00e08a4273566a72f3e9bcc540e7b7fe734e

See more details on using hashes here.

File details

Details for the file pystreamci-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: pystreamci-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 16.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for pystreamci-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b3a83e5c07cfb3ee224b4a36e5320d6eb59fff2981ed62ed698c773b9132cd41
MD5 17d011206421a48bffd18f671b0585e5
BLAKE2b-256 7e1ab7dd8f1fc9ffabe4e168c1542991f0f7b27fa4f3a2d023dbf2b3b56e37ff

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