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).
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');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);// 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 -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.