مستندات›أدلة›Query your database (SDK) الاستعلام عن قاعدة البيانات الخاصة بك باستخدام JavaScript SDK
التدفقات اليومية لـ aura.db والقواعد التي ترفض المكالمات غير الآمنة وكيفية حماية الجدول بأمان على مستوى الصف.
9 د قراءة·المستوى وسيطة·تمت المراجعة في 12/10/2026
تم إنشاء هذا النص الإنجليزي تلقائيًا من النص الأصلي الفرنسي ولم تتم مراجعته بعد.
تمت ترجمة هذه الصفحة تلقائيًا. النسخة الإنجليزية موثوقة.
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).
write.tstypescript
// قم بإدراج صف واحد، أو مجموعة من الصفوف، واستعادتها
const { data } = await aura.from('todos').insert({ title: 'Write the docs' }).select()
// منزعج
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 حسب التصميم: احتفظ به على الخادم الخاص بك.
أنشئ دالة من خادم، ثم اتصل بها من أي مكان باستخدام 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().