Skip to main content

Simple and transparent SurrealDB connection management for Python

Project description

surreal-basics

PyPI version License: MIT Python 3.10+

Simple and transparent SurrealDB connection abstraction for Python.

Why surreal-basics?

When working with SurrealDB, you need to manage connections, authentication, and namespaces for each operation. surreal-basics abstracts this complexity, offering:

  • Automatic connection: Configure once, use anywhere
  • Optimized performance: Persistent (singleton) connections for WebSocket and HTTP
  • Smart retry: Automatic handling of transient errors (lock conflicts)
  • Consistent API: repo_* functions for async and repo_*_sync for sync

Installation

pip install surreal-basics

Or with uv:

uv add surreal-basics

Quick Start

Configuration via environment variables

export SURREAL_HOST=localhost
export SURREAL_PORT=8000
export SURREAL_USER=root
export SURREAL_PASS=root
export SURREAL_NS=test
export SURREAL_DB=test
export SURREAL_MODE=ws  # or "http"

Basic usage

from surreal_basics import repo_query, repo_create, repo_select

# Simple query
results = await repo_query("SELECT * FROM user WHERE active = true")

# Create record (automatic timestamps)
user = await repo_create("user", {"name": "John", "email": "john@test.com"})

# Select by ID
user = await repo_select("user:123")

Synchronous mode

from surreal_basics import repo_query_sync, repo_create_sync

# Same operations, without async/await
results = repo_query_sync("SELECT * FROM user")
user = repo_create_sync("user", {"name": "Mary"})

Programmatic configuration

import surreal_basics

# Configure connection
surreal_basics.init(
    host="localhost",
    port=8000,
    namespace="my_ns",
    database="my_db",
    mode="ws",  # "ws" or "http"
    persistent=True,  # persistent connection (recommended)
)

# Or just change the mode
surreal_basics.mode = "http"

Performance

Benchmarks with 1000 operations each (localhost):

Operation HTTP Sync HTTP Async WS Sync WS Async
CREATE ~130 ops/s ~180 ops/s ~650 ops/s ~750 ops/s
SELECT ~150 ops/s ~200 ops/s ~800 ops/s ~3500 ops/s
UPDATE ~130 ops/s ~170 ops/s ~600 ops/s ~2800 ops/s
DELETE ~140 ops/s ~190 ops/s ~700 ops/s ~3000 ops/s

Recommendation: Use WebSocket (mode="ws") for best performance. HTTP is useful for serverless environments or when WebSocket is not available.

API Reference

Async Functions

Function Description
repo_query(query, vars) Execute SurrealQL query
repo_create(table, data) Create record with timestamps
repo_select(table_or_id) Select records or by ID
repo_update(table, id, data) Update existing record
repo_upsert(table, id, data) Create or update (merge)
repo_delete(record_id) Delete record
repo_insert(table, data_list) Bulk insert
repo_relate(source, rel, target) Create relationship

Sync Functions

All async functions have sync equivalents with _sync suffix:

  • repo_query_sync, repo_create_sync, etc.

Configuration

Variable Default Description
SURREAL_HOST localhost SurrealDB host
SURREAL_PORT 8000 Port
SURREAL_USER root Username
SURREAL_PASS root Password
SURREAL_NS test Namespace
SURREAL_DB test Database
SURREAL_MODE ws Mode: "ws" or "http"
SURREAL_PERSISTENT true Persistent connection

Migrations

surreal-basics includes a built-in migration system for managing SurrealDB schema changes.

Quick start

# Create a migration
sbl-migrate create create_users --dir ./migrations

# Check status
sbl-migrate status --dir ./migrations

# Apply pending migrations
sbl-migrate up --dir ./migrations

# Rollback last migration
sbl-migrate down --dir ./migrations

Programmatic usage

from surreal_basics.migrate import MigrationRunner, AsyncMigrationRunner

# Sync
runner = MigrationRunner("./migrations")
runner.run_up()

# Async
runner = AsyncMigrationRunner("./migrations")
await runner.run_up()

Migration files use the naming convention NNN_name.surrealql with optional NNN_name_down.surrealql for rollbacks. See docs/migrations.md for full documentation.

Error Handling

from surreal_basics import (
    SurrealDBConnectionError,  # Connection failed
    SurrealDBMigrationError,   # Migration failed
    SurrealDBQueryError,       # Query error (no retry)
    SurrealDBTransientError,   # Transient error (automatic retry)
)

try:
    result = await repo_query("SELECT * FROM user")
except SurrealDBConnectionError as e:
    print(f"Connection failed: {e}")
except SurrealDBQueryError as e:
    print(f"Query error: {e}")

Documentation

See docs/ for complete documentation including:

Development

# Clone and install
git clone https://github.com/lfnovo/surreal-basics.git
cd surreal-basics
uv sync

# Run tests
uv run pytest

# Run benchmark
uv run python benchmark_library.py

License

MIT

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

surreal_basics-0.3.2.tar.gz (110.7 kB view details)

Uploaded Source

Built Distribution

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

surreal_basics-0.3.2-py3-none-any.whl (23.5 kB view details)

Uploaded Python 3

File details

Details for the file surreal_basics-0.3.2.tar.gz.

File metadata

  • Download URL: surreal_basics-0.3.2.tar.gz
  • Upload date:
  • Size: 110.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for surreal_basics-0.3.2.tar.gz
Algorithm Hash digest
SHA256 e47b885a2c7f08a16babbbb36a5975753c19e8df2739a5d8bd2c71d932097d07
MD5 bd69f10085d4ff04244d04f25f57d8b2
BLAKE2b-256 18e9911f543232c6f506c20e4ad9562ca18a5802ba912067bb6cf548e2a09866

See more details on using hashes here.

File details

Details for the file surreal_basics-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: surreal_basics-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 23.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for surreal_basics-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e3342c0e7ea09a983c9d9ad0669468f82fdf7b687d0e6bed3f783d90fe05c5ae
MD5 8f0243185ecee2c0f94b8626cb0e46f4
BLAKE2b-256 9cb9d7fb7a744290961cd5f702bf7d4a2ef7cad3a35d020f2472f4324e8124b5

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