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.0.tar.gz (107.0 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.0-py3-none-any.whl (22.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: surreal_basics-0.3.0.tar.gz
  • Upload date:
  • Size: 107.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","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.0.tar.gz
Algorithm Hash digest
SHA256 d8ee5297c15b95e43cbca29aa30c9222dc2e191602b55c95ca79d93e4c9428d5
MD5 be216d3463065979ba0a152d092c47cb
BLAKE2b-256 7ecd682da9ef42b695404f2741d49ddad71bda46dbc9b3fd681044ceb3ecff12

See more details on using hashes here.

File details

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

File metadata

  • Download URL: surreal_basics-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 22.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8e3ac245ed52dc18a10e77749cdd6a5805efa2f0f9a23a7f3703f92b873ee785
MD5 a134610de6b4265636bbb2639b38370a
BLAKE2b-256 4211d95f0670694fba2332068be9dab3305da99c427f4a54a5f37d6e658a1113

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