Veri Sorgulama

Veritabanınızdaki verileri nasıl sorgulayacağınızı ve filtreleyeceğinizi öğrenin.

Not: Bu içerik, tanıtım amacıyla hazırlanmış örnek/yer tutucu bir içeriktir.

Supabase'in sorgu oluşturucusunu kullanarak verileri verimli şekilde sorgulayın ve filtreleyin.

Temel Sorgular

Tümünü Seçme

const { data, error } = await client
  .from('projects')
  .select('*');

Belirli Sütunları Seçme

const { data, error } = await client
  .from('projects')
  .select('id, name, created_at');

İlişkili Verilerle Seçme

const { data, error } = await client
  .from('projects')
  .select(`
    id,
    name,
    account:accounts(id, name),
    tasks(id, title, completed)
  `);

Filtreleme

Eşittir

const { data } = await client
  .from('projects')
  .select('*')
  .eq('status', 'active');

Eşit Değildir

const { data } = await client
  .from('projects')
  .select('*')
  .neq('status', 'deleted');

Büyüktür / Küçüktür

const { data } = await client
  .from('projects')
  .select('*')
  .gt('created_at', '2024-01-01')
  .lt('budget', 10000);

Dizi İçinde

const { data } = await client
  .from('projects')
  .select('*')
  .in('status', ['active', 'pending']);

Like (Desen Eşleştirme)

const { data } = await client
  .from('projects')
  .select('*')
  .like('name', '%website%');

Tam Metin Arama

const { data } = await client
  .from('projects')
  .select('*')
  .textSearch('description', 'design & development');

Sıralama

Order By

const { data } = await client
  .from('projects')
  .select('*')
  .order('created_at', { ascending: false });

Çoklu Order By

const { data } = await client
  .from('projects')
  .select('*')
  .order('status')
  .order('created_at', { ascending: false });

Sayfalama

Limit

const { data } = await client
  .from('projects')
  .select('*')
  .limit(10);

Aralık (Offset)

const page = 2;
const pageSize = 10;
const from = (page - 1) * pageSize;
const to = from + pageSize - 1;

const { data, count } = await client
  .from('projects')
  .select('*', { count: 'exact' })
  .range(from, to);

Toplama İşlemleri

Sayma

const { count } = await client
  .from('projects')
  .select('*', { count: 'exact', head: true });

Filtrelerle Sayma

const { count } = await client
  .from('projects')
  .select('*', { count: 'exact', head: true })
  .eq('status', 'active');

Gelişmiş Sorgular

Birden Fazla Filtre

const { data } = await client
  .from('projects')
  .select('*')
  .eq('account_id', accountId)
  .eq('status', 'active')
  .gte('created_at', startDate)
  .lte('created_at', endDate)
  .order('created_at', { ascending: false })
  .limit(20);

OR Koşulları

const { data } = await client
  .from('projects')
  .select('*')
  .or('status.eq.active,status.eq.pending');

İç İçe OR

const { data } = await client
  .from('projects')
  .select('*')
  .or('and(status.eq.active,priority.eq.high),status.eq.urgent');

Join'ler

Inner Join

const { data } = await client
  .from('projects')
  .select(`
    *,
    account:accounts!inner(
      id,
      name
    )
  `)
  .eq('account.name', 'Acme Corp');

Left Join

const { data } = await client
  .from('projects')
  .select(`
    *,
    tasks(*)
  `);

Null Değerleri İşleme

Null Olanlar

const { data } = await client
  .from('projects')
  .select('*')
  .is('completed_at', null);

Null Olmayanlar

const { data} = await client
  .from('projects')
  .select('*')
  .not('completed_at', 'is', null);

Veri Ekleme

Tekli Ekleme

const { data, error } = await client
  .from('projects')
  .insert({
    name: 'New Project',
    account_id: accountId,
    status: 'active',
  })
  .select()
  .single();

Çoklu Ekleme

const { data, error } = await client
  .from('projects')
  .insert([
    { name: 'Project 1', account_id: accountId },
    { name: 'Project 2', account_id: accountId },
  ])
  .select();

Veri Güncelleme

Filtreyle Güncelleme

const { data, error } = await client
  .from('projects')
  .update({ status: 'completed' })
  .eq('id', projectId)
  .select()
  .single();

Birden Fazla Satırı Güncelleme

const { data, error } = await client
  .from('projects')
  .update({ status: 'archived' })
  .eq('account_id', accountId)
  .lt('updated_at', oldDate);

Veri Silme

Filtreyle Silme

const { error } = await client
  .from('projects')
  .delete()
  .eq('id', projectId);

Birden Fazla Kaydı Silme

const { error } = await client
  .from('projects')
  .delete()
  .in('id', projectIds);

Upsert

Ekle veya Güncelle

const { data, error } = await client
  .from('projects')
  .upsert({
    id: projectId,
    name: 'Updated Name',
    status: 'active',
  })
  .select()
  .single();

RPC (Saklı Yordamlar)

Veritabanı Fonksiyonunu Çağırma

const { data, error } = await client
  .rpc('get_user_projects', {
    user_id: userId,
  });

Karmaşık Parametrelerle

const { data, error } = await client
  .rpc('search_projects', {
    search_term: 'design',
    account_ids: [1, 2, 3],
    min_budget: 5000,
  });

Hata Yönetimi

Temel Hata Yönetimi

const { data, error } = await client
  .from('projects')
  .select('*');

if (error) {
  console.error('Error fetching projects:', error.message);
  throw error;
}

return data;

Tür Belirtilmiş Hata Yönetimi

import { PostgrestError } from '@supabase/supabase-js';

function handleDatabaseError(error: PostgrestError) {
  switch (error.code) {
    case '23505': // unique_violation
      throw new Error('A project with this name already exists');
    case '23503': // foreign_key_violation
      throw new Error('Invalid account reference');
    default:
      throw new Error('Database error: ' + error.message);
  }
}

TypeScript Türleri

Oluşturulan Türler

import { Database } from '~/types/database.types';

type Project = Database['public']['Tables']['projects']['Row'];
type ProjectInsert = Database['public']['Tables']['projects']['Insert'];
type ProjectUpdate = Database['public']['Tables']['projects']['Update'];

Tür Belirtilmiş Sorgular

const { data } = await client
  .from('projects')
  .select('*')
  .returns<Project[]>();

Performans İpuçları

  1. Yalnızca gereken sütunları seçin - select('*') ifadesini gereksiz yere kullanmayın
  2. İndeks kullanın - Sık filtrelenen sütunlarda indeks oluşturun
  3. Sonuçları sınırlayın - Büyük veri kümelerini her zaman sayfalayın
  4. N+1 sorgularından kaçının - Birden fazla sorgu yerine join kullanın
  5. Karmaşık sorgular için RPC kullanın - Mantığı veritabanına taşıyın
  6. Mümkün olduğunda önbelleğe alın - React Query veya benzerini kullanın
  7. Sorguları profilleyin - SQL'de EXPLAIN ANALYZE kullanın

En İyi Uygulamalar

  1. Hataları her zaman işleyin - Hata yanıtlarını kontrol edin
  2. Girdileri doğrulayın - Zod veya benzerini kullanın
  3. TypeScript kullanın - Türleri oluşturun ve kullanın
  4. Tutarlı adlandırma - Veritabanı adlandırma kurallarına uyun
  5. Karmaşık sorguları belgeleyin - Yorum ekleyin
  6. Sorguları test edin - Veritabanı işlemleri için birim testleri yazın
  7. Performansı izleyin - Yavaş sorguları takip edin