شعار أوراباسي
aurabaseمستندات
مستندات›أدلة›Query your database (SDK)

الاستعلام عن قاعدة البيانات الخاصة بك باستخدام JavaScript SDK

التدفقات اليومية لـ aura.db والقواعد التي ترفض المكالمات غير الآمنة وكيفية حماية الجدول بأمان على مستوى الصف.

9 د قراءة·المستوى وسيطة·تمت المراجعة في 12‏/10‏/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()

// منزعج
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().