Aurabase-logo
aurabasisdocumenten
documenten›Gidsen›Query your database (SDK)

Voer een query uit op uw database met de JavaScript SDK

De dagelijkse stromen van aura.db, de regels die onveilige oproepen weigeren en hoe u een tabel kunt beschermen met beveiliging op rijniveau.

9 min lezen·Niveau tussenproduct·Herzien op 12 okt 2026
Deze Engelse tekst is automatisch gegenereerd op basis van het Franse origineel en is nog niet beoordeeld.
Deze pagina is automatisch vertaald. De Engelse versie is gezaghebbend.
#
Lees

1. Lees rijen

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') is een snelkoppeling voor aura.db.from('todos'). Elke oproep retourneert { data, error } en gooit nooit, zie clientopties en fouten.

Filterketen: eq, neq, gt, gte, lt, lte, like, ilike, in, is en de andere vermeld in de databasereferentie . Voor een pagina met rijen gebruikt u range(from, to).

#
Schrijf

2. Invoegen, bijwerken en verwijderen

write.tstypescript
// Voeg één rij in, of een reeks rijen, en haal ze terug
const { data } = await aura.from('todos').insert({ title: 'Write the docs' }).select()

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

// Bijwerken en verwijderen hebben een filter nodig
await aura.from('todos').update({ done: true }).eq('id', id)
await aura.from('todos').delete().eq('id', id)

Twee regels beschermen u tegen fouten:

  • Voor een batchinvoeging zijn in elke rij dezelfde sleutels nodig. Rijen met verschillende sleutels retourneren 400 met All object keys must match. Vul de ontbrekende sleutels met null.
  • update() en delete() zonder filter worden geweigerd door de client met de foutcode unfiltered_mutation, voordat er een verzoek wordt verzonden. Om elke rij expres te wijzigen, voert u SQL uit vanaf een server.
#
Resultaten

3. Eén rij, veel rijen, telt

count.tstypescript
// Precies één rij: een fout als er geen of meerdere zijn
const one = await aura.from('todos').select('*').eq('id', id).single()
// → error.status 406 wanneer het filter overeenkomt met nul of meerdere rijen

// Nul of één rij: gegevens zijn nul als er niets overeenkomt
const maybe = await aura.from('todos').select('*').eq('id', id).maybeSingle()

// Rijen en hun totaal
const page = await aura.from('todos').select('*', { count: 'exact' }).range(0, 9)
// page.count is het totaal, ongeacht het bereik

// Alleen het totaal, geen rijen
const { count } = await aura.from('todos').select('*', { count: 'exact', head: true })

count: 'exact' telt elke overeenkomende rij. 'planned' en 'estimated' zijn sneller op zeer grote tafels en bij benadering.

#
Beveiliging

4. Bescherm een tafel

Een in SQL gemaakte tabel is geopend totdat u RLS inschakelt

Beveiliging op rijniveau is uitgeschakeld in een nieuwe tabel. Met de publieke sleutel kan iedereen deze lezen en schrijven. Schakel het in en voeg vervolgens het benodigde beleid toe:

SQLsql
alter table todos enable row level security;

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

De databaserollen zijn aura_anon, aura_authenticated en aura_service_role. auth.uid() is NULL voor de openbare sleutel en een gebruikers-ID voor een aangemelde gebruiker. Zie Beveiliging op rijniveau.

Een service_role sleutel omzeilt RLS door zijn ontwerp: bewaar hem op uw server.

#
Functies

5. SQL-functies en rpc

Maak een functie vanaf een server en roep deze vervolgens overal aan met rpc():

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
  • grant_execute_to is vereist om het aan te roepen. Zonder dit kan niemand de functie uitvoeren. Een rol die niet in de lijst staat, krijgt 403 permission denied for function. Zowel authenticated als aura_authenticated worden geaccepteerd.
  • Na enkele seconden kan een nieuwe functie worden opgeroepen. Totdat de API zijn schema opnieuw laadt, retourneert rpc() 404 Could not find the function.
  • Het maken van functies met onbewerkte SQL (CREATE FUNCTION) wordt geweigerd: gebruik createFunction.
#
Server

6. Voer SQL uit vanaf een server

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() heeft een service_role sleutel nodig. Het weigert een DELETE zonder een WHERE en leest geen systeemcatalogi zoals pg_class of pg_roles. Gebruik admin.db.schema() om uw tabellen weer te geven.

Laatst bijgewerkt · 12 okt 2026