Logo Aurabase
aurabazadokumenty
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