Meta / DDL (jadval yaratish)

Jadval yaratish va boshqa DDL (CREATE/ALTER/DROP) hamda ixtiyoriy SQL'ni API orqali bajarish. Bu management operatsiyasi — faqat service_key bilan ishlaydi, anon_key bilan emas.


Data-plane vs management

storagedb'da anon_key va service_key — DATA uchun (REST /rest/v1/...): qator o'qish, qo'shish, yangilash. Lekin jadval YARATISH (DDL) — bu boshqa, kuchliroq operatsiya.

DDL uchun alohida endpoint bor: POST /v1/<REF>/meta/query — ixtiyoriy SQL bajaradi (CREATE TABLE, ALTER, CREATE FUNCTION, index, policy…).

MUHIM: bu endpoint faqat `service_key` bilan ishlaydi. anon_key bilan so'rov 403 qaytaradi (meta/query uchun service_role kerak) — ommaviy client jadvalni yaratib/o'zgartirib yubora olmasligi kerak. Shuning uchun service_key'ni faqat backend'da ishlating, brauzerga chiqarmang.

SDK: db.meta.query()

@storagedb/client SDK'sida db.meta.query(sql) metodi mavjud. U { data, error } qaytaradi: SELECT bo'lsa data — qatorlar massivi; DDL bo'lsa data — bo'sh massiv ([]).

Client'ni service_key bilan yarating (faqat server tomonda).

Jadval yaratish (DDL)
import { createClient } from '@storagedb/client';

// faqat backend'da — service_key brauzerga chiqmasin
const db = createClient(
  'https://storage.identify.uz/v1/<REF>',
  process.env.SERVICE_KEY!
);

const { error } = await db.meta.query(`
  create table public.todos (
    id bigint generated always as identity primary key,
    title text not null,
    done boolean default false,
    created_at timestamptz default now()
  )
`);

if (error) console.error('DDL xatosi:', error.message);
else console.log('Jadval yaratildi');
SELECT — natija data'da
const { data, error } = await db.meta.query<{ count: number }>(
  'select count(*)::int as count from public.todos'
);

if (!error) console.log('Qatorlar:', data?.[0]?.count);
RLS bilan birga (tavsiya etiladi)
// Jadval yaratgandan keyin RLS yoqing va siyosat qo'shing
await db.meta.query(`
  alter table public.todos enable row level security;
  create policy "own todos" on public.todos
    for all to authenticated
    using (owner = auth.uid()) with check (owner = auth.uid());
`);

curl orqali

SDK'siz, to'g'ridan-to'g'ri ham chaqirsa bo'ladi. Body { "query": "<SQL>" }, header apikey: <SERVICE_KEY>. Javob: muvaffaqiyatda { "rows": [...] }, xatoda { "error": "..." } (HTTP 400).

curl: CREATE TABLE
curl -X POST https://storage.identify.uz/v1/<REF>/meta/query \
  -H "apikey: <SERVICE_KEY>" \
  -H "content-type: application/json" \
  -d '{"query":"create table public.todos (id bigint generated always as identity primary key, title text not null)"}'

# Javob: {"rows":[]}

Eslatmalar va cheklovlar

— Avto-schema YO'Q: bo'lmagan jadvalga insert qilsangiz, u o'zi yaralmaydi (REST → 404). Postgres aniq CREATE TABLE talab qiladi.

anon_key bilan ishlamaydi (403) — ataylab. Faqat service_key.

— So'rov tranzaksiyada service_role ostida va STATEMENT_TIMEOUT_MS (default 15s) bilan bajariladi.

— Dashboard'dagi SQL Editor va Table Editor ham aynan shu endpoint orqali ishlaydi.

Savol bormi? Hujjatlarni GitHub'da yaxshilashga yordam bering.