документы›Путеводители›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 г.