Learn SurrealDB

Described as “A scalable, distributed, collaborative, document-graph database, for the realtime web” – written in Rust

Let’s take a look, and see if it’s easy to learn and suitable for an upcoming project.

SurrealDB Rust SDK – Example Code

Features:

https://surrealdb.com/features

You can test here :

https://surrealist.app/query

Install

https://surrealdb.com/docs/surrealdb/installation/overview

curl -sSf https://install.surrealdb.com | sh
curl -sSf https://install.surrealdb.com | sh

Start the database

surreal start --log info --user root --pass root file:mydatabase.db

Add a ‘record’ to the Database

CREATE account SET
    name = 'ACME Inc',
    created_at = time::now()
;

Select from

SELECT * FROM article WHERE author.age < 30 FETCH author, account;
SELECT count() FROM article GROUP BY count;
SELECT count() FROM
SELECT array::group(name) FROM author GROUP ALL;
[
  {
    "result": [
      {
        "array::group": [
          {
            "first": "Mike",
            "full": "Mike Adams",
            "last": "Adams"
          },
          {
            "first": "Mike_id",
            "full": "Mike_id Adams",
            "last": "Adams"
          }
        ]
      }
    ],
    "status": "OK",
    "time": "595.39µs"
  }
]
SELECT  id FROM author WHERE name.first = 'Mike';
[
  {
    "result": [
      {
        "id": "author:mike"
      }
    ],
    "status": "OK",
    "time": "147.037µs"
  }
]
SELECT * FROM article WHERE author.age < 30 FETCH author, account;
[
  {
    "result": [
      {
        "author": null,
        "created_at": "2024-03-07T00:03:16.626593397Z",
        "id": "article:7hek7v510xpw26astj88",
        "text": "Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.",
        "title": "Lorem ipsum dolor"
      },
      {
        "author": null,
        "created_at": "2024-03-07T00:03:17.753581846Z",
        "id": "article:jqefxibhivi7163uug5l",
        "text": "Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.",
        "title": "Lorem ipsum dolor"
      },
      {
        "author": null,
        "created_at": "2024-03-07T00:03:18.655875513Z",
        "id": "article:smodpxmfrqc6qpqkiud5",
        "text": "Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.",
        "title": "Lorem ipsum dolor"
      },
      {
        "author": null,
        "created_at": "2024-03-06T23:51:11.776807515Z",
        "id": "article:tc5w56rka3gfbb2r2f09",
        "text": "Donec eleifend, nunc vitae commodo accumsan, mauris est fringilla.",
        "title": "Lorem ipsum dolor"
      }
    ],
    "status": "OK",
    "time": "258.375µs"
  }
]
Use SurrealDB with Rust
use serde::{Deserialize, Serialize};
use surrealdb::engine::remote::ws::Ws;
use surrealdb::opt::auth::Root;
use surrealdb::sql::Thing;
use surrealdb::Surreal;

#[derive(Debug, Serialize)]
struct Name<'a> {
    first: &'a str,
    last: &'a str,
}

#[derive(Debug, Serialize)]
struct Person<'a> {
    title: &'a str,
    name: Name<'a>,
    marketing: bool,
}

#[derive(Debug, Serialize)]
struct Responsibility {
    marketing: bool,
}

#[derive(Debug, Deserialize)]
struct Record {
    #[allow(dead_code)]
    id: Thing,
}

#[tokio::main]
async fn main() -> surrealdb::Result<()> {
    // Connect to the server
    let db = Surreal::new::<Ws>("127.0.0.1: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("test").use_db("test").await?;

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

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

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

    // Perform a custom advanced query
    let groups = db
        .query("SELECT marketing, count() FROM type::table($table) GROUP BY marketing")
        .bind(("table", "person"))
        .await?;
    dbg!(groups);

    Ok(())
}

Previous article

Proof of work

Next article

Sorting in Rust