Aurabase-Logo
AurabasisDokumente
Dokumente›Führer›Query your database (SDK)

Fragen Sie Ihre Datenbank mit dem JavaScript SDK ab

Die alltäglichen Abläufe von aura.db, die Regeln, die unsichere Aufrufe ablehnen, und wie man eine Tabelle mit Sicherheit auf Zeilenebene schützt.

9 Min. gelesen·Ebene Mittelstufe·Überarbeitet am 12.10.2026
Dieser englische Text wurde automatisch aus dem französischen Original generiert und wurde noch nicht überprüft.
Diese Seite wurde automatisch übersetzt. Maßgeblich ist die englische Version.
#
Lesen

1. Zeilen lesen

read.tstypescript
const { data, error } = await aura
  .from('todos')
  .select('id, title, done')
  .eq('done', false)
  .order('created_at', { ascending: false })
  .limit(20)

aura.from('todos') ist eine Abkürzung für aura.db.from('todos'). Jeder Aufruf gibt { data, error } zurück und löst nie aus, siehe Clientoptionen und Fehler.

Filterkette: eq, neq, gt, gte, lt, lte, like, ilike, in, is und die anderen, die in der Datenbankreferenz aufgeführt sind. Verwenden Sie für eine Seite mit Zeilen range(from, to).

#
Schreiben

2. Einfügen, Aktualisieren und Löschen

write.tstypescript
// Fügen Sie eine Zeile oder ein Array von Zeilen ein und erhalten Sie sie zurück
const { data } = await aura.from('todos').insert({ title: 'Write the docs' }).select()

// Upsert
await aura.from('todos').upsert({ id, title: 'Renamed' }).select()

// Für das Aktualisieren und Löschen ist ein Filter erforderlich
await aura.from('todos').update({ done: true }).eq('id', id)
await aura.from('todos').delete().eq('id', id)

Zwei Regeln schützen Sie vor Fehlern:

  • Eine Batch-Einfügung benötigt in jeder Zeile die gleichen Schlüssel. Zeilen mit unterschiedlichen Schlüsseln geben 400 mit All object keys must match zurück. Füllen Sie die fehlenden Schlüssel mit null aus.
  • update() und delete() ohne Filter werden vom Client mit dem Fehlercode unfiltered_mutation abgelehnt, bevor eine Anfrage gesendet wird. Um jede Zeile absichtlich zu ändern, führen Sie SQL von einem Server aus.
#
Ergebnisse

3. Eine Reihe, viele Reihen zählen

count.tstypescript
// Genau eine Zeile: ein Fehler, wenn keine oder mehrere vorhanden sind
const one = await aura.from('todos').select('*').eq('id', id).single()
// → error.status 406, wenn der Filter mit null oder mehreren Zeilen übereinstimmt

// Null oder eine Zeile: Daten sind null, wenn nichts übereinstimmt
const maybe = await aura.from('todos').select('*').eq('id', id).maybeSingle()

// Zeilen und ihre Summe
const page = await aura.from('todos').select('*', { count: 'exact' }).range(0, 9)
// page.count ist die Gesamtzahl, unabhängig vom Bereich

// Nur die Summe, keine Zeilen
const { count } = await aura.from('todos').select('*', { count: 'exact', head: true })

count: 'exact' zählt jede passende Zeile. 'planned' und 'estimated' sind bei sehr großen Tabellen und ungefähren Werten schneller.

#
Sicherheit

4. Schützen Sie einen Tisch

Eine in SQL erstellte Tabelle ist geöffnet, bis Sie RLS aktivieren.

Die Sicherheit auf Zeilenebene ist von in einer neuen Tabelle. Mit dem öffentlichen Schlüssel kann ihn jeder lesen und schreiben. Aktivieren Sie es und fügen Sie dann die benötigten Richtlinien hinzu:

SQLsql
alter table todos enable row level security;

create policy todos_own_read on todos
  for select to aura_authenticated
  using (auth.uid() = owner);

Die Datenbankrollen sind aura_anon, aura_authenticated und aura_service_role. auth.uid() ist NULL für den öffentlichen Schlüssel und eine Benutzer-ID für einen angemeldeten Benutzer. Siehe Sicherheit auf Zeilenebene.

Ein service_role-Schlüssel umgeht RLS von Natur aus: Behalten Sie ihn auf Ihrem Server.

#
Funktionen

5. SQL-Funktionen und RPC

Erstellen Sie eine Funktion von einem Server und rufen Sie sie dann von überall mit rpc() auf:

server/setup.tstypescript
await admin.db.createFunction({
  name: 'add',
  args: [
    { name: 'a', data_type: 'int', mode: 'IN' },
    { name: 'b', data_type: 'int', mode: 'IN' },
  ],
  returns: 'int',
  language: 'sql',
  body: 'SELECT a + b',
  grant_execute_to: ['anon', 'authenticated'],
})
client.tstypescript
const { data } = await aura.rpc('add', { a: 1, b: 2 }) // → 3
  • Zum Aufruf ist grant_execute_to erforderlich. Ohne sie kann niemand die Funktion ausführen. Eine Rolle, die nicht aufgeführt ist, erhält 403 permission denied for function. Es werden sowohl authenticated als auch aura_authenticated akzeptiert.
  • Eine neue Funktion ist nach einigen Sekunden aufrufbar. Bis die API ihr Schema neu lädt, gibt rpc() 404 Could not find the function zurück.
  • Das Erstellen von Funktionen mit unformatiertem SQL (CREATE FUNCTION) wird abgelehnt: Verwenden Sie createFunction.
#
Server

6. Führen Sie SQL von einem Server aus

server/migrate.tstypescript
import { createAdminClient } from '@aurabase/aurabase-js'

const admin = createAdminClient(process.env.AURA_URL!, process.env.AURA_SERVICE_ROLE_KEY!)

await admin.db.sql(`
  create table if not exists todos (
    id uuid primary key default gen_random_uuid(),
    title text not null,
    done boolean not null default false,
    owner uuid,
    created_at timestamptz not null default now()
  )
`)

db.sql() benötigt einen service_role-Schlüssel. Es lehnt einen DELETE ohne WHERE ab und liest keine Systemkataloge wie pg_class oder pg_roles. Um Ihre Tabellen aufzulisten, verwenden Sie admin.db.schema().

Zuletzt aktualisiert · 12.10.2026