EDGE DB

Banco de dados edge

Um banco de dados relacional isolado por cliente, criado sob demanda. Manda SQL de verdade por HTTP, sem schema fixo, sem servidor de banco pra provisionar.

Edge database

An isolated relational database per client, created on demand. Send real SQL over HTTP, no fixed schema, no database server to provision.

SYNC resposta na mesma chamada answers in the same call

Endpoints

Endpoints

POST /api/v1/edgedb/{name}/query executa uma instrução SQL, o banco é criado na primeira chamada runs one SQL statement, the database is created on first call
GET /api/v1/edgedb lista os bancos do cliente lists the client's databases
DELETE /api/v1/edgedb/{name} remove um banco inteiro removes an entire database

Não existe um POST /create separado. O nome no path é criado sozinho na primeira query. SELECT/PRAGMA/EXPLAIN/WITH devolvem linhas; qualquer outra instrução (INSERT/UPDATE/DELETE/CREATE/...) devolve rows_affected/last_insert_id.

There's no separate POST /create. The name in the path is created on its own on first query. SELECT/PRAGMA/EXPLAIN/WITH return rows; any other statement (INSERT/UPDATE/DELETE/CREATE/...) returns rows_affected/last_insert_id.

Bloqueio deliberado: ATTACH é rejeitado, é o único jeito de escapar pro filesystem do servidor. Fora isso, é o SQL do próprio cliente contra o próprio banco dele, sem sanitização além disso.

Deliberate block: ATTACH is rejected, it's the one way to escape onto the server's filesystem. Beyond that, it's the client's own SQL against their own database, no further sanitizing.

Parâmetros

Parameters

NomeNameOndeInDescriçãoDescription
name path nome do banco, isolado por cliente: um banco próprio por (cliente, nome) database name, isolated per client: its own database per (client, name)
sql body a instrução SQL a executar the SQL statement to run
args body opcional: valores posicionais pros ? da instrução (evita concatenar valor no SQL) optional: positional values for the statement's ? placeholders (avoids concatenating values into the SQL)

Exemplo

Example

curl -X POST "https://api.alicercelabs.com.br/api/v1/edgedb/meubanco/query" \
          -H "Authorization: Bearer <token>" \
          -d '{"sql":"CREATE TABLE pedidos (id INTEGER PRIMARY KEY, cliente TEXT)"}'
        
        curl -X POST "https://api.alicercelabs.com.br/api/v1/edgedb/meubanco/query" \
          -H "Authorization: Bearer <token>" \
          -d '{"sql":"INSERT INTO pedidos (cliente) VALUES (?)","args":["Fulano"]}'
        
        curl -X POST "https://api.alicercelabs.com.br/api/v1/edgedb/meubanco/query" \
          -H "Authorization: Bearer <token>" \
          -d '{"sql":"SELECT * FROM pedidos"}'
{
          "success": true,
          "data": { "columns": ["id", "cliente"], "rows": [[1, "Fulano"]] },
          "meta": { "elapsed_ms": 1, "request_id": "..." }
        }

Erros possíveis

Possible errors

StatusMotivoReason
400nome de banco inválido, sql vazio, ATTACH, erro de sintaxe/execução do próprio SQL, ou limite de bancos atingidoinvalid database name, empty sql, ATTACH, the client's own SQL syntax/execution error, or the database limit reached
401token ausente ou inválidomissing or invalid token
429limite de taxa excedidorate limit exceeded
503Edge DB não configurado no servidorEdge DB not configured on the server

Usando o SDK

Using the SDK

Um banco por (cliente, banco), criado sob demanda na primeira query, sem passo de criação separado.

One database per (client, database), created on demand on the first query, no separate create step.

SDKs oficiais: Go · Python · JavaScript.

Official SDKs: Go · Python · JavaScript.

Criar tabela e inserir dados

Create a table and insert data

o banco meubanco é criado na hora, se ainda não existir.

the meubanco database is created on the spot if it doesn't exist yet.

import (
	"context"
	"fmt"

	alicercelabs "github.com/alicercelabs/alicercesdk-go"
)

client := alicercelabs.New("alk_...")
ctx := context.Background()

client.EdgeDB.Query(ctx, "meubanco", "CREATE TABLE t (id INTEGER PRIMARY KEY, nome TEXT)", nil)
client.EdgeDB.Query(ctx, "meubanco", "INSERT INTO t (nome) VALUES (?)", []any{"Fulano"})
from alicercelabs import AlicerceLabs

client = AlicerceLabs(api_key="alk_...")

client.edgedb.query("meubanco", "CREATE TABLE t (id INTEGER PRIMARY KEY, nome TEXT)")
client.edgedb.query("meubanco", "INSERT INTO t (nome) VALUES (?)", ["Fulano"])
import { AlicerceLabs } from "alicercesdk-javascript";

const client = new AlicerceLabs("alk_...");

await client.edgedb.query("meubanco", "CREATE TABLE t (id INTEGER PRIMARY KEY, nome TEXT)");
await client.edgedb.query("meubanco", "INSERT INTO t (nome) VALUES (?)", ["Fulano"]);

Consultar

Query

res, err := client.EdgeDB.Query(ctx, "meubanco", "SELECT * FROM t", nil)
fmt.Println(res.Rows)
res = client.edgedb.query("meubanco", "SELECT * FROM t")
print(res["rows"])
const res = await client.edgedb.query("meubanco", "SELECT * FROM t");
console.log(res.rows);

Listar bancos / remover um banco

List databases / delete one

dbs, err := client.EdgeDB.List(ctx)
err = client.EdgeDB.Delete(ctx, "meubanco")
dbs = client.edgedb.list()
client.edgedb.delete("meubanco")
const dbs = await client.edgedb.list();
await client.edgedb.delete("meubanco");

Limites

Limits

1.000/dia · 41/hora. Bancos por cliente: 10 por padrão. Tamanho máximo por banco: 50MB, aplicado internamente pelo próprio banco de dados. Timeout de query: 5s. Tudo tunável por cliente via admin.

1,000/day · 41/hour. Databases per client: 10 by default. Max size per database: 50MB, enforced internally by the database itself. Query timeout: 5s. All tunable per client via admin.