Skip to main content

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

Compatibility

Built on the official surrealdb 2.x SDK, which supports SurrealDB servers v2.0.0 through v3.x. Requires Python 3.11+.

SurrealDB 3.x note: v3 is stricter than v2 — reading from a table that was never defined (e.g. SELECT * FROM thing before any record exists) raises an error instead of returning an empty list. Define the table or insert a record first. surreal-basics surfaces this difference rather than masking it.

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
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
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_AUTH_SCOPE root Signin scope: "root", "namespace", or "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

# Abort if the target isn't the namespace/database you expect
sbl-migrate up --expect-ns acme-prod --expect-db app

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

Metadata

Release files for surreal-basics 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for surreal-basics 0.7.0
File Size Uploaded
surreal_basics-0.7.0.tar.gz 167.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for surreal-basics 0.7.0
File Interpreter ABI Platform
surreal_basics-0.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 199.1 kB

Release files / surreal_basics-0.7.0.tar.gz

Download URL surreal_basics-0.7.0.tar.gz
Size 167.5 kB
Tags Source
SHA-256 checksum
How to use checksums
3750f514672de05f0edbe2444fb9172ddb0a6ec591dd9f3ab70961c0ec9e0929
BLAKE2b-256 checksum
How to use checksums
d1fbf9623d987df7d02958bb6acf4ee8a985f522c3e2fbea2ae6b4044e8cb670
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","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}

Release files / surreal_basics-0.7.0-py3-none-any.whl

Download URL surreal_basics-0.7.0-py3-none-any.whl
Size 31.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cd4e5e96354256c49ace17c2d280ac2a157e08359458d76b9ab6932a0c5f6b36
BLAKE2b-256 checksum
How to use checksums
437ad841e25abd1faba99f026d216bd88b567c16dc19297c7a5f77ba7b5d348d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","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}

Release history Release notifications | RSS feed

0.8.1

2 release files

0.8.0

2 release files

This release

0.7.0 This release

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page