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

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

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.6.0.tar.gz (163.8 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.6.0-py3-none-any.whl (29.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: surreal_basics-0.6.0.tar.gz
  • Upload date:
  • Size: 163.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","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.6.0.tar.gz
Algorithm Hash digest
SHA256 21351d2924863b487a7b84a5b24134b5aeedf31ae188ffc663f491b9b4b5e7fb
MD5 a98fd454d68b1a3af88ea5b4ef59d792
BLAKE2b-256 2baab61241941f652aeed81a487f4ab30651e8ad943dbd7e3c3dd9b7671b13c1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: surreal_basics-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 29.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","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.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c1022b5955f4f91ff2c953033bec40c5bd3dac7fea4f06750cd7746641db5dcc
MD5 55b7fbb8d5073e044c117e80b4ed844f
BLAKE2b-256 9b98224bcfdadfa827d60d1a1d201152e85be77c9efab321c8a2a22b1a11f61c

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page