Crate surrealdb

source ·
Expand description

This library provides a low-level database library implementation, a remote client and a query language definition, for SurrealDB, the ultimate cloud database for tomorrow’s applications. SurrealDB is a scalable, distributed, collaborative, document-graph database for the realtime web.

This library can be used to start an embedded in-memory datastore, an embedded datastore persisted to disk, a browser-based embedded datastore backed by IndexedDB, or for connecting to a distributed TiKV key-value store.

It also enables simple and advanced querying of a remote SurrealDB server from server-side or client-side code. All connections to SurrealDB are made over WebSockets by default, and automatically reconnect when the connection is terminated.

Examples

use serde::{Serialize, Deserialize};
use serde_json::json;
use std::borrow::Cow;
use surrealdb::{Result, Surreal};
use surrealdb::sql;
use surrealdb::opt::auth::Root;
use surrealdb::engine::remote::ws::Ws;

#[derive(Serialize, Deserialize)]
struct Name {
    first: Cow<'static, str>,
    last: Cow<'static, str>,
}

#[derive(Serialize, Deserialize)]
struct Person {
    title: Cow<'static, str>,
    name: Name,
    marketing: bool,
}

#[tokio::main]
async fn main() -> Result<()> {
    let db = Surreal::new::<Ws>("localhost:8000").await?;

    // Signin as a namespace, database, or root user
    db.signin(Root {
        username: "root",
        password: "root",
    }).await?;

    // Select a specific namespace / database
    db.use_ns("namespace").use_db("database").await?;

    // Create a new person with a random ID
    let created: Vec<Person> = db.create("person")
        .content(Person {
            title: "Founder & CEO".into(),
            name: Name {
                first: "Tobie".into(),
                last: "Morgan Hitchcock".into(),
            },
            marketing: true,
        })
        .await?;

    // Create a new person with a specific ID
    let created: Option<Person> = db.create(("person", "jaime"))
        .content(Person {
            title: "Founder & COO".into(),
            name: Name {
                first: "Jaime".into(),
                last: "Morgan Hitchcock".into(),
            },
            marketing: false,
        })
        .await?;

    // Update a person record with a specific ID
    let updated: Option<Person> = db.update(("person", "jaime"))
        .merge(json!({"marketing": true}))
        .await?;

    // Select all people records
    let people: Vec<Person> = db.select("person").await?;

    // Perform a custom advanced query
    let sql = r#"
        SELECT marketing, count()
        FROM type::table($table)
        GROUP BY marketing
    "#;

    let groups = db.query(sql)
        .bind(("table", "person"))
        .await?;

    Ok(())
}

Modules

  • Datastore module which is the core of the database node. In this module we essentially manage the entire lifecycle of a database request acting as the glue between the API and the response. In this module we use channels as a transport layer and executors to process the operations. This module also gives a context to the transaction.
  • Different embedded and remote database engines
  • Different error types for embedded and remote databases
  • How the keys are structured in the key value store
  • The module defining the key value store. Everything related the transaction for the key value store is defined in the tx.rs file. This module enables the following operations on the key value store:
  • Methods to use when interacting with a SurrealDB instance
  • The different options and types for use in API functions
  • The full type definitions for the SurrealQL query language
  • Module containing the implementation of the surrealql tokens, lexer, and parser.

Structs

  • The future returned when creating a new SurrealDB instance
  • A live query notification
  • The response type of a Surreal::query request
  • A database client instance for embedded or remote databases

Enums

  • The action performed on a record
  • An error originating from the SurrealDB client library

Traits

  • Connection trait implemented by supported engines

Type Aliases

  • A specialized Result type