Complete examples for the OxiDB Python client. TCP mode: pip install oxidb · Embedded mode: pip install oxidb-embedded
from oxidb import OxiDbClient
# Connect to localhost:4444 (default)
client = OxiDbClient()
# Custom host/port/timeout
client = OxiDbClient("192.168.1.10", 4444, timeout=10.0)
# As a context manager (auto-closes)
with OxiDbClient() as db:
db.ping() # "pong"
# Insert a single document
result = client.insert("users", {
"name": "Alice",
"email": "[email protected]",
"age": 30,
})
# result: {"id": "..."}
# Insert many documents
result = client.insert_many("users", [
{"name": "Bob", "age": 25},
{"name": "Charlie", "age": 35},
{"name": "Diana", "age": 28},
])
# Find all users over 25
users = client.find("users", {"age": {"$gt": 25}})
# Find with sort, skip, limit
users = client.find("users", {},
sort={"age": -1},
skip=0,
limit=10,
)
# Find one document
user = client.find_one("users", {"name": "Alice"})
# Count documents
count = client.count("users", {"age": {"$gte": 18}})
# Comparison: $eq, $ne, $gt, $gte, $lt, $lte
query = {"age": {"$gte": 18, "$lt": 65}}
# $in — match any value in list
query = {"status": {"$in": ["active", "pending"]}}
# $exists — check field presence
query = {"email": {"$exists": True}}
# $regex — pattern matching
query = {"name": {"$regex": "^A"}}
# $and / $or — logical operators
query = {"$or": [
{"age": {"$lt": 18}},
{"age": {"$gte": 65}},
]}
# Nested fields with dot notation
query = {"address.city": "Berlin"}
# Update all matching documents
result = client.update("users",
{"name": "Alice"},
{"$set": {"age": 31}},
)
# Update one document
result = client.update_one("users",
{"name": "Bob"},
{
"$inc": {"login_count": 1},
"$set": {"last_login": "2026-03-05T12:00:00Z"},
},
)
# Update operators: $set, $unset, $inc, $mul, $min, $max,
# $rename, $currentDate, $push, $pull, $addToSet, $pop
# Delete all matching documents
result = client.delete("users", {"age": {"$lt": 18}})
# Delete one document
result = client.delete_one("users", {"name": "Charlie"})
# Create a regular index
client.create_index("users", "age")
# Create a unique index
client.create_unique_index("users", "email")
# Create a composite index
client.create_composite_index("orders", ["customer_id", "date"])
# List indexes on a collection
indexes = client.list_indexes("users")
# Drop an index
client.drop_index("users", "idx_age")
# Group users by city, count and average age
results = client.aggregate("users", [
{"$match": {"age": {"$gte": 18}}},
{"$group": {
"_id": "$city",
"count": {"$sum": 1},
"avg_age": {"$avg": "$age"},
}},
{"$sort": {"count": -1}},
{"$limit": 10},
])
# Pipeline stages: $match, $group, $sort, $project,
# $limit, $skip, $unwind, $addFields, $lookup, $count
# Context manager (auto-commit / auto-rollback)
with client.transaction():
client.insert("accounts", {"owner": "Alice", "balance": 1000})
client.update_one("accounts",
{"owner": "Bob"},
{"$inc": {"balance": -500}},
)
# auto-committed here
# Manual transaction control
client.begin_tx()
# ... operations ...
client.commit_tx() # or client.rollback_tx()
# Execute SQL queries
result = client.sql("SELECT * FROM users WHERE age > 25 ORDER BY name")
client.sql("INSERT INTO users (name, age) VALUES ('Eve', 22)")
client.sql("UPDATE users SET age = 31 WHERE name = 'Alice'")
client.sql("DELETE FROM users WHERE age < 18")
client.sql("CREATE INDEX idx_age ON users (age)")
# JOINs and GROUP BY
result = client.sql("""
SELECT u.name, COUNT(o._id) as order_count
FROM users u
JOIN orders o ON u._id = o.user_id
GROUP BY u.name
ORDER BY order_count DESC
""")
# Create a text index on fields
client.create_text_index("articles", ["title", "body"])
# Search within a collection's text index
results = client.text_search("articles", "rust database", limit=20)
# Search across blobs (PDF, DOCX, etc.)
results = client.search("quarterly report", limit=10)
# Create a vector index
client.create_vector_index("products", "embedding", dimension=384, metric="cosine")
# Insert documents with vector embeddings
client.insert("products", {
"name": "Wireless Mouse",
"embedding": query_vector, # list of 384 floats
})
# Find 5 nearest neighbors
results = client.vector_search("products", "embedding", query_vector, limit=5)
# Each result has _similarity and _distance fields
# Create a bucket
client.create_bucket("documents")
# Upload a file
with open("report.pdf", "rb") as f:
client.put_object("documents", "report.pdf", f.read(),
content_type="application/pdf",
metadata={"author": "Alice"})
# Download a file
data, metadata = client.get_object("documents", "report.pdf")
# Extract text from PDF/DOCX/HTML
text = client.extract_text("documents", "report.pdf")
# List objects with prefix filter
objects = client.list_objects("documents", prefix="reports/")
# Delete
client.delete_object("documents", "report.pdf")
# Create a schedule
client.create_schedule("cleanup", "delete_old_logs",
cron="0 3 * * *", # every day at 3 AM
params={"days": 30},
)
# List, enable, disable, delete
schedules = client.list_schedules()
client.disable_schedule("cleanup")
client.enable_schedule("cleanup")
client.delete_schedule("cleanup")
# Collection management
client.create_collection("users")
collections = client.list_collections()
client.drop_collection("temp")
# Multi-database support
client.create_database("analytics")
client.use_database("analytics")
databases = client.list_databases()
client.drop_database("analytics")
# Compaction (reclaim disk space)
stats = client.compact("users")
# stats: {"old_size": ..., "new_size": ..., "docs_kept": ...}
# Per-database role grants (requires Admin)
client.grant_db_role("alice", "analytics", "Admin")
client.revoke_db_role("alice", "analytics")
from oxidb import OxiDbClient, OxiDbError, TransactionConflictError
try:
client.insert("users", {"_id": "duplicate"})
except OxiDbError as e:
print(f"Error: {e}")
# Transaction conflict (OCC)
try:
with client.transaction():
client.update("accounts", {}, {"$inc": {"balance": 1}})
except TransactionConflictError:
print("Conflict — retry the transaction")
# TCP client — connects to oxidb-server
pip install oxidb
# Embedded mode — runs in-process, no server needed
pip install oxidb-embedded
# Or just copy the single TCP client file
curl -O https://oxidb.baltavista.com/oxidb.py
from oxidb_embedded import OxiDbEmbedded
# Run the database engine directly in your Python process
# No server required — zero network overhead
with OxiDbEmbedded("./mydata") as db:
db.insert("users", {"name": "Alice", "age": 30})
users = db.find("users", {"age": {"$gt": 25}})
print(users)
# Encryption at rest
db = OxiDbEmbedded("./mydata", encryption_key_path="./key.bin")
# Same API as TCP client — insert, find, update, delete,
# indexes, aggregation, transactions, search, blobs
db.create_index("users", "email")
db.aggregate("users", [
{"$group": {"_id": "$city", "count": {"$sum": 1}}},
])
with db.transaction():
db.insert("accounts", {"owner": "Bob", "balance": 500})
db.update_one("accounts", {"owner": "Alice"}, {"$inc": {"balance": -500}})
db.close()
# Requires the native library (liboxidb_embedded_ffi.dylib/.so/.dll)
# Set OXIDB_LIB_PATH or place it next to the installed package