DEV Community

Alex Spinov
Alex Spinov

Posted on

SurrealDB Has a Free API You've Never Heard Of

SurrealDB is a multi-model database that combines SQL, document, graph, and time-series capabilities in a single engine. It has a powerful query language called SurrealQL and can run embedded in your app or as a server.

What Makes SurrealDB Special?

  • Multi-model — relational + document + graph in one
  • SurrealQL — SQL-like but with graph traversal and JavaScript
  • Real-time — live queries with WebSocket
  • Embedded or server — runs in-process or as a service
  • Free — open source, BSL license

The Hidden API: SurrealQL

-- Create records without predefined schema
CREATE user:john SET
  name = 'John Doe',
  email = 'john@example.com',
  age = 30,
  interests = ['coding', 'music'],
  address = {
    city: 'London',
    country: 'UK'
  };

-- Graph relations — no JOINs needed!
RELATE user:john->follows->user:jane SET since = time::now();
RELATE user:john->likes->post:abc SET at = time::now();

-- Graph traversal query
SELECT name, ->follows->user.name AS following,
  <-follows<-user.name AS followers
FROM user:john;

-- Subqueries and computed fields
SELECT *,
  count(->likes->post) AS total_likes,
  ->follows->user->likes->post.* AS feed
FROM user
WHERE age > 25;
Enter fullscreen mode Exit fullscreen mode

Live Queries — Real-Time API

import Surreal from 'surrealdb.js';

const db = new Surreal();
await db.connect('ws://localhost:8000/rpc');
await db.use({ namespace: 'app', database: 'main' });

// Live query — auto-updates!
const queryUuid = await db.live('messages', (action, result) => {
  switch (action) {
    case 'CREATE': console.log('New:', result); break;
    case 'UPDATE': console.log('Updated:', result); break;
    case 'DELETE': console.log('Deleted:', result); break;
  }
});

// CRUD operations
await db.create('messages', {
  text: 'Hello World',
  author: 'user:john',
  channel: 'general'
});
Enter fullscreen mode Exit fullscreen mode

Embedded Mode

use surrealdb::Surreal;
use surrealdb::engine::local::Mem;

#[tokio::main]
async fn main() {
    let db = Surreal::new::<Mem>(()).await.unwrap();
    db.use_ns("app").use_db("main").await.unwrap();

    // Full database in-process — no server needed
    let users: Vec<User> = db.select("user").await.unwrap();
}
Enter fullscreen mode Exit fullscreen mode

Quick Start

curl -sSf https://install.surrealdb.com | sh
surreal start --user root --pass root
# Connect at localhost:8000
Enter fullscreen mode Exit fullscreen mode

Why Developers Choose SurrealDB

A developer shared: "We had PostgreSQL for data, Redis for caching, and Neo4j for graph queries. SurrealDB replaced all three. One database, one query language, and the graph traversal is built right into SQL-like syntax."


Need database solutions? Email spinov001@gmail.com or check my developer tools.

Multi-model or specialized databases? What's your approach?

Top comments (0)