Логотип Аурабаза
аурабазадокументы
документы›Путеводители›Query your database (SDK)

Запрос к базе данных с помощью JavaScript SDK

Ежедневные потоки aura.db, правила, запрещающие небезопасные вызовы, и способы защиты таблицы с помощью безопасности на уровне строк.

9 мин читать·Уровень средний·Пересмотрено 12 окт. 2026 г.
Этот текст на английском языке был создан автоматически на основе французского оригинала и еще не проверялся.
Эта страница была переведена автоматически. Английская версия является авторитетной.
#
Читать

1. Прочитайте строки

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') — это ярлык для aura.db.from('todos'). Каждый вызов возвращает { data, error } и никогда не выдает ошибку, см. параметры и ошибки клиента .

Цепочка фильтров: eq, neq, gt, gte, lt, lte, like, ilike, in, is и другие, перечисленные в справочнике по базе данных .. Для страницы строк используйте range(from, to).

#
Писать

2. Вставка, обновление и удаление

write.tstypescript
// Вставьте одну строку или массив строк и верните их обратно.
const { data } = await aura.from('todos').insert({ title: 'Write the docs' }).select()

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

// Для обновления и удаления нужен фильтр
await aura.from('todos').update({ done: true }).eq('id', id)
await aura.from('todos').delete().eq('id', id)

Два правила защитят вас от ошибок:

  • Для пакетной вставки нужны одни и те же ключи в каждой строке. Строки с разными ключами возвращают 400 с All object keys must match. Заполните недостающие ключи null.
  • update() и delete() без фильтра отклоняются клиентом с кодом ошибки unfiltered_mutation до отправки любого запроса. Чтобы намеренно изменить каждую строку, запустите SQL с сервера.
#
Результаты

3. Один ряд, много рядов, считается.

count.tstypescript
// Ровно одна строка: ошибка, если их нет или несколько
const one = await aura.from('todos').select('*').eq('id', id).single()
// → error.status 406, когда фильтр соответствует нулю или нескольким строкам

// Ноль или одна строка: данные равны нулю, если ничего не соответствует
const maybe = await aura.from('todos').select('*').eq('id', id).maybeSingle()

// Строки и их сумма
const page = await aura.from('todos').select('*', { count: 'exact' }).range(0, 9)
// page.count — это сумма, независимо от диапазона

// Только итог, без строк
const { count } = await aura.from('todos').select('*', { count: 'exact', head: true })

count: 'exact' подсчитывает каждую совпадающую строку. 'planned' и 'estimated' работают быстрее на очень больших таблицах и приблизительны.

#
Безопасность

4. Защитите стол

Таблица, созданная в SQL, открыта до тех пор, пока вы не включите RLS.

Безопасность на уровне строк — от в новой таблице. Благодаря открытому ключу любой может прочитать и записать его. Включите его, затем добавьте необходимые политики:

SQLsql
alter table todos enable row level security;

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

Роли базы данных: aura_anon, aura_authenticated и aura_service_role. auth.uid() — это NULL для открытого ключа и идентификатора для вошедшего в систему пользователя. См. Безопасность на уровне строк.

Ключ service_role намеренно обходит RLS: сохраните его на своем сервере.

#
Функции

5. Функции SQL и RPC

Создайте функцию на сервере, а затем вызовите ее из любого места с помощью 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. Без него никто не сможет выполнить функцию. Роль, которой нет в списке, получает 403 permission denied for function. Принимаются как authenticated, так и aura_authenticated.
  • Новая функция может быть вызвана через несколько секунд. Пока API не перезагрузит свою схему, rpc() возвращает 404 Could not find the function.
  • Создание функций с использованием чистого SQL (CREATE FUNCTION) запрещено: используйте createFunction.
#
Сервер

6. Запуск SQL с сервера

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() нужен ключ service_role. Он отклоняет DELETE без WHERE и не читает системные каталоги, такие как pg_class или pg_roles. Чтобы перечислить ваши таблицы, используйте admin.db.schema().

Последнее обновление · 12 окт. 2026 г.