DEV Community

Alex Spinov
Alex Spinov

Posted on

EdgeDB Has a Free API — The Post-SQL Database with a Better Query Language

EdgeDB is a database that replaces SQL with EdgeQL — a more expressive, composable query language. Built on PostgreSQL, it gives you schemas, migrations, and type safety without the ORM.

Why EdgeDB?

  • EdgeQL — more readable and powerful than SQL
  • Schema-first — define schema with SDL, auto-generate migrations
  • Built-in auth — user management included
  • Type generation — generates TypeScript types from schema

Quick Start

curl --proto '=https' --tlsv1.2 -sSf https://sh.edgedb.com | sh
edgedb project init
Enter fullscreen mode Exit fullscreen mode

Schema

# dbschema/default.esdl
module default {
  type User {
    required name: str;
    required email: str {
      constraint exclusive;
    };
    multi posts: Post;
  }

  type Post {
    required title: str;
    required content: str;
    required author: User;
    created_at: datetime {
      default := datetime_current();
    };
    tags: array<str>;
  }
}
Enter fullscreen mode Exit fullscreen mode
edgedb migration create
edgedb migrate
Enter fullscreen mode Exit fullscreen mode

EdgeQL Queries

# Insert
insert User {
  name := 'Alice',
  email := 'alice@example.com'
};

# Select with nested data
select User {
  name,
  email,
  posts: {
    title,
    created_at
  } order by .created_at desc
} filter .email = 'alice@example.com';

# Update
update User filter .id = <uuid>$id
set { name := 'Alice Smith' };

# Delete
delete Post filter .id = <uuid>$id;
Enter fullscreen mode Exit fullscreen mode

TypeScript Client

npm install edgedb
npx @edgedb/generate edgeql-js
Enter fullscreen mode Exit fullscreen mode
import { createClient } from 'edgedb';
import e from './dbschema/edgeql-js';

const client = createClient();

// Fully typed query builder
const users = await e.select(e.User, (user) => ({
  name: true,
  email: true,
  posts: (post) => ({
    title: true,
    created_at: true,
    order_by: { expression: post.created_at, direction: e.DESC },
  }),
  filter_single: e.op(user.email, '=', 'alice@example.com'),
})).run(client);

// Insert
const newUser = await e.insert(e.User, {
  name: 'Bob',
  email: 'bob@example.com',
}).run(client);
Enter fullscreen mode Exit fullscreen mode

Computed Properties

type User {
  required first_name: str;
  required last_name: str;
  full_name := .first_name ++ ' ' ++ .last_name;
  post_count := count(.posts);
}
Enter fullscreen mode Exit fullscreen mode

Need a powerful database for scraped data? Check out my Apify actors for web scraping, or email spinov001@gmail.com for custom database solutions.

EdgeDB, PostgreSQL, or MongoDB — which database do you use? Share below!

Top comments (0)