ऑराबेस लोगो
aurabaseडॉक्स
डॉक्स›गाइड›Query your database (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()

// अपसर्ट
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)

दो नियम आपको गलतियों से बचाते हैं:

  • एक बैच इंसर्ट के लिए प्रत्येक पंक्ति में समान कुंजियों की आवश्यकता होती है। विभिन्न कुंजियों वाली पंक्तियाँ All object keys must match के साथ 400 लौटाती हैं। लुप्त कुंजियों को null से भरें।
  • बिना फ़िल्टर वाले update() और delete() को किसी भी अनुरोध को भेजने से पहले त्रुटि कोड unfiltered_mutation के साथ क्लाइंट द्वारा अस्वीकार कर दिया जाता है। प्रत्येक पंक्ति को जानबूझकर बदलने के लिए, सर्वर से SQL चलाएँ।
#
परिणाम

3. एक पंक्ति, अनेक पंक्तियाँ, मायने रखती हैं

count.tstypescript
// बिल्कुल एक पंक्ति: यदि कोई नहीं या अनेक हैं तो त्रुटि
const one = await aura.from('todos').select('*').eq('id', id).single()
// → त्रुटि.स्थिति 406 जब फ़िल्टर शून्य या कई पंक्तियों से मेल खाता है

// शून्य या एक पंक्ति: जब कुछ भी मेल नहीं खाता तो डेटा शून्य होता है
const maybe = await aura.from('todos').select('*').eq('id', id).maybeSingle()

// पंक्तियाँ और उनका कुल
const page = await aura.from('todos').select('*', { count: 'exact' }).range(0, 9)
// पेज.काउंट कुल है, चाहे सीमा कुछ भी हो

// केवल कुल, कोई पंक्तियाँ नहीं
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. एसक्यूएल फ़ंक्शन और आरपीसी

किसी सर्वर से एक फ़ंक्शन बनाएं, फिर उसे 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 दोनों स्वीकार किए जाते हैं।
  • एक नया फ़ंक्शन कुछ सेकंड के बाद कॉल करने योग्य होता है। जब तक एपीआई अपनी स्कीमा को पुनः लोड नहीं करता, 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 कुंजी की आवश्यकता है। यह WHERE के बिना DELETE को अस्वीकार कर देता है, और यह pg_class या pg_roles जैसे सिस्टम कैटलॉग को नहीं पढ़ता है। अपनी तालिकाओं को सूचीबद्ध करने के लिए, admin.db.schema() का उपयोग करें।