dokumenty›Przewodniki›Query your database (SDK) Zapytaj swoją bazę danych za pomocą pakietu JavaScript SDK
Codzienne przepływy aura.db, reguły odrzucające niebezpieczne wywołania i sposoby ochrony tabeli za pomocą zabezpieczeń na poziomie wiersza.
9 min przeczytane·Poziom mediator·Zmieniono 12 paź 2026
Ten tekst w języku angielskim został wygenerowany automatycznie na podstawie francuskiego oryginału i nie był jeszcze recenzowany.
Ta strona została przetłumaczona automatycznie. Wersja angielska jest miarodajna.
#Czytać
1. Przeczytaj wiersze
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') to skrót od aura.db.from('todos'). Każde wywołanie zwraca { data, error } i nigdy nie powoduje zgłoszenia, zobacz opcje klienta i błędy .
Łańcuch filtrów: eq, neq, gt, gte, lt, lte, like, ilike, in, is i inne wymienione w odnośniku bazy danych . W przypadku strony wierszy użyj range(from, to).
#Pisać
2. Wstaw, zaktualizuj i usuń
write.tstypescript
// Wstaw jeden wiersz lub tablicę wierszy i odzyskaj je
const { data } = await aura.from('todos').insert({ title: 'Write the docs' }).select()
// Wstaw
await aura.from('todos').upsert({ id, title: 'Renamed' }).select()
// Aktualizowanie i usuwanie wymaga filtra
await aura.from('todos').update({ done: true }).eq('id', id)
await aura.from('todos').delete().eq('id', id)
Przed błędami chronią Cię dwie zasady:
- Wstawianie wsadowe wymaga tych samych kluczy w każdym wierszu. Wiersze z różnymi kluczami zwracają
400 z All object keys must match. Wypełnij brakujące klucze za pomocą null.
update() i delete() bez filtra są odrzucane przez klienta z kodem błędu unfiltered_mutation przed wysłaniem jakiegokolwiek żądania. Aby celowo zmienić każdy wiersz, uruchom SQL z serwera.
#Wyniki
3. Liczy się jeden rząd, wiele rzędów
count.tstypescript
// Dokładnie jeden wiersz: błąd, jeśli nie ma ich wcale lub jest ich kilka
const one = await aura.from('todos').select('*').eq('id', id).single()
// → error.status 406, gdy filtr pasuje do zera lub kilku wierszy
// Zero lub jeden wiersz: dane mają wartość null, gdy nic nie pasuje
const maybe = await aura.from('todos').select('*').eq('id', id).maybeSingle()
// Wiersze i ich suma
const page = await aura.from('todos').select('*', { count: 'exact' }).range(0, 9)
// page.count to suma, niezależnie od zakresu
// Tylko suma, bez wierszy
const { count } = await aura.from('todos').select('*', { count: 'exact', head: true })
count: 'exact' zlicza każdy pasujący wiersz. 'planned' i 'estimated' są szybsze w przypadku bardzo dużych tabel i są przybliżone.
#Bezpieczeństwo
4. Chroń stół
Tabela utworzona w SQL jest otwarta do momentu włączenia RLS
Zabezpieczenia na poziomie wiersza są wyłączone w nowej tabeli. Dzięki kluczowi publicznemu każdy może go czytać i zapisywać. Włącz tę opcję, a następnie dodaj potrzebne zasady:
SQLsql
alter table todos enable row level security;
create policy todos_own_read on todos
for select to aura_authenticated
using (auth.uid() = owner);
Role bazy danych to aura_anon, aura_authenticated i aura_service_role. auth.uid() to NULL dla klucza publicznego i identyfikatora użytkownika zalogowanego. Zobacz Zabezpieczenia na poziomie wiersza.
Klucz service_role omija RLS zgodnie z projektem: przechowuj go na swoim serwerze.
#Funkcje
5. Funkcje SQL i RPC
Utwórz funkcję na serwerze, a następnie wywołaj ją z dowolnego miejsca za pomocą 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
- Do wywołania wymagane jest
grant_execute_to. Bez tego nikt nie może wykonać tej funkcji. Rola, która nie jest wymieniona, otrzymuje 403 permission denied for function. Akceptowane są zarówno authenticated, jak i aura_authenticated.
- Po kilku sekundach można wywołać nową funkcję. Dopóki interfejs API nie przeładuje swojego schematu,
rpc() zwraca 404 Could not find the function.
- Tworzenie funkcji z surowym SQL (
CREATE FUNCTION) jest zabronione: użyj createFunction.
#Serwer
6. Uruchom SQL z serwera
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() potrzebuje klucza service_role. Odrzuca DELETE bez WHERE i nie czyta katalogów systemowych, takich jak pg_class lub pg_roles. Aby wyświetlić listę tabel, użyj admin.db.schema().
Ostatnia aktualizacja · 12 paź 2026