Logotipo de Aurabase
aurabasedocumentos
documentos›Guías›Query your database (SDK)

Consulta tu base de datos con el SDK de JavaScript

Los flujos cotidianos de aura.db, las reglas que rechazan llamadas inseguras y cómo proteger una tabla con seguridad a nivel de fila.

9 min leer·Nivel intermedio·Revisado el 12 oct 2026
Este texto en inglés se generó automáticamente a partir del original en francés y aún no ha sido revisado.
Esta página fue traducida automáticamente. La versión en inglés es autorizada.
#
leer

1. Leer filas

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') es un atajo para aura.db.from('todos'). Cada llamada devuelve { data, error } y nunca se produce; consulte las opciones y errores del cliente .

Cadena de filtros: eq, neq, gt, gte, lt, lte, like, ilike, in, is y los demás enumerados en la referencia de la base de datos . Para una página de filas, utilice range(from, to).

#
escribir

2. Insertar, actualizar y eliminar

write.tstypescript
// Inserte una fila o una serie de filas y recupérelas
const { data } = await aura.from('todos').insert({ title: 'Write the docs' }).select()

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

// Actualizar y eliminar necesitan un filtro
await aura.from('todos').update({ done: true }).eq('id', id)
await aura.from('todos').delete().eq('id', id)

Dos reglas te protegen de errores:

  • Una inserción por lotes necesita las mismas claves en cada fila. Las filas con claves diferentes devuelven 400 con All object keys must match. Complete las claves que faltan con null.
  • update() y delete() sin filtro son rechazados por el cliente con el código de error unfiltered_mutation, antes de enviar cualquier solicitud. Para cambiar cada fila a propósito, ejecute SQL desde un servidor.
#
Resultados

3. Una fila, muchas filas, cuentan

count.tstypescript
// Exactamente una fila: error si no hay ninguna o varias
const one = await aura.from('todos').select('*').eq('id', id).single()
// → error.status 406 cuando el filtro coincide con cero o varias filas

// Cero o una fila: los datos son nulos cuando nada coincide
const maybe = await aura.from('todos').select('*').eq('id', id).maybeSingle()

// Filas y su total.
const page = await aura.from('todos').select('*', { count: 'exact' }).range(0, 9)
// page.count es el total, sea cual sea el rango

// Solo el total, sin filas
const { count } = await aura.from('todos').select('*', { count: 'exact', head: true })

count: 'exact' cuenta cada fila coincidente. 'planned' y 'estimated' son más rápidos en tablas muy grandes y aproximados.

#
Seguridad

4. Proteger una mesa

Una tabla creada en SQL está abierta hasta que habilites RLS

La seguridad a nivel de fila está desactivada en una tabla nueva. Con la clave pública, cualquiera puede leerla y escribirla. Habilítelo y luego agregue las políticas que necesita:

SQLsql
alter table todos enable row level security;

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

Las funciones de la base de datos son aura_anon, aura_authenticated y aura_service_role. auth.uid() es NULL para la clave pública y una identificación de usuario para un usuario que ha iniciado sesión. Consulte Seguridad a nivel de fila.

Una clave service_role omite RLS por diseño: manténgala en su servidor.

#
Funciones

5. Funciones SQL y rpc

Cree una función desde un servidor, luego llámela desde cualquier lugar con 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
  • Se requiere grant_execute_to para llamarlo. Sin él, nadie puede ejecutar la función. Un rol que no aparece en la lista obtiene 403 permission denied for function. Se aceptan tanto authenticated como aura_authenticated.
  • Se puede llamar a una nueva función después de unos segundos. Hasta que la API recargue su esquema, rpc() devuelve 404 Could not find the function.
  • Se rechaza la creación de funciones con SQL sin formato (CREATE FUNCTION): use createFunction.
#
Servidor

6. Ejecute SQL desde un servidor

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() necesita una clave service_role. Rechaza un DELETE sin un WHERE y no lee catálogos del sistema como pg_class o pg_roles. Para enumerar sus tablas, use admin.db.schema().

Última actualización · 12 oct 2026