Logo Aurabase
aurabasedocuments
documents›Guides›Query your database (SDK)

Interrogez votre base de données avec le SDK JavaScript

Les flux quotidiens de aura.db, les règles qui refusent les appels dangereux et comment protéger une table avec une sécurité au niveau des lignes.

9 min de lecture·Niveau intermédiaire·Révisé le 12 oct. 2026
Ce texte anglais a été généré automatiquement à partir de l’original français et n’a pas encore été relu.
Cette page a été traduite automatiquement. La version anglaise fait foi.
#
Lire

1. Lire les lignes

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') est un raccourci pour aura.db.from('todos'). Chaque appel renvoie { data, error } et ne lance jamais, voir les options et erreurs du client .

Chaîne de filtres : eq, neq, gt, gte, lt, lte, like, ilike, in, is et les autres répertoriés dans la référence de la base de données . Pour une page de lignes, utilisez range(from, to).

#
Écrire

2. Insérer, mettre à jour et supprimer

write.tstypescript
// Insérez une ligne ou un tableau de lignes et récupérez-les
const { data } = await aura.from('todos').insert({ title: 'Write the docs' }).select()

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

// La mise à jour et la suppression nécessitent un filtre
await aura.from('todos').update({ done: true }).eq('id', id)
await aura.from('todos').delete().eq('id', id)

Deux règles vous protègent des erreurs :

  • Une insertion par lots nécessite les mêmes clés dans chaque ligne. Les lignes avec des clés différentes renvoient 400 avec All object keys must match. Remplissez les clés manquantes avec null.
  • update() et delete() sans filtre sont refusés par le client avec le code erreur unfiltered_mutation, avant l'envoi de toute requête. Pour modifier volontairement chaque ligne, exécutez SQL à partir d'un serveur.
#
Résultats

3. Une ligne, plusieurs lignes, ça compte

count.tstypescript
// Exactement une ligne : une erreur s'il n'y en a pas ou plusieurs
const one = await aura.from('todos').select('*').eq('id', id).single()
// → error.status 406 lorsque le filtre correspond à zéro ou plusieurs lignes

// Zéro ou une ligne : les données sont nulles lorsque rien ne correspond
const maybe = await aura.from('todos').select('*').eq('id', id).maybeSingle()

// Lignes et leur total
const page = await aura.from('todos').select('*', { count: 'exact' }).range(0, 9)
// page.count est le total, quelle que soit la plage

// Le total uniquement, pas de lignes
const { count } = await aura.from('todos').select('*', { count: 'exact', head: true })

count: 'exact' compte chaque ligne correspondante. 'planned' et 'estimated' sont plus rapides sur de très grandes tables et approximatives.

#
Sécurité

4. Protégez une table

Une table créée en SQL est ouverte jusqu'à ce que vous activiez RLS

La sécurité au niveau des lignes est sur sur une nouvelle table. Avec la clé publique, n’importe qui peut la lire et l’écrire. Activez-le, puis ajoutez les stratégies dont vous avez besoin :

SQLsql
alter table todos enable row level security;

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

Les rôles de base de données sont aura_anon, aura_authenticated et aura_service_role. auth.uid() est NULL pour la clé publique et un identifiant utilisateur pour un utilisateur connecté. Voir Sécurité au niveau des lignes.

Une clé service_role contourne RLS de par sa conception : conservez-la sur votre serveur.

#
Fonctions

5. Fonctions SQL et rpc

Créez une fonction depuis un serveur, puis appelez-la de n'importe où avec 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 est requis pour l'appeler. Sans cela, personne ne peut exécuter la fonction. Un rôle qui n'est pas répertorié obtient 403 permission denied for function. authenticated et aura_authenticated sont acceptés.
  • Une nouvelle fonction est appelable après quelques secondes. Jusqu'à ce que l'API recharge son schéma, rpc() renvoie 404 Could not find the function.
  • La création de fonctions avec du SQL brut (CREATE FUNCTION) est refusée : utilisez createFunction.
#
Serveur

6. Exécutez SQL à partir d'un serveur

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() nécessite une clé service_role. Il refuse un DELETE sans un WHERE et ne lit pas les catalogues système tels que pg_class ou pg_roles. Pour lister vos tables, utilisez admin.db.schema().

Dernière mise à jour · 12 oct. 2026