İçeriğe geç
NarDBv0.2.0-dev

Doğrulama

check kuralları, nullable, default ve parola alanları.

Kurallar her insert ve update'te uygulanır. Kurala uymayan bir değer yazılmaz ve hata mesajı hangi alanın neden reddedildiğini söyler.

check#

NarQL
create_schema('kisiler')
    .fields({
        'email':  {type: string, max_length: 100, index: {unique: true},
                   check: regex('^[\w.-]+@([\w-]+\.)+[\w-]{2,4}$')},
        'age':    {type: int8, check: {min: 0, max: 120}},
        'gender': {type: int8, check: enum({0: 'male', 1: 'female'})},
        'kayit':  {type: date, check: {min: '2020-01-01'}}
    })
    .commit();
KuralUygulandığı türler
{min: …, max: …}sayılar, decimal, tarihler
regex('…')string, text (RE2 sözdizimi: ileri bakış ve geri başvuru yok)
enum({değer: 'etiket'})tamsayılar ve metin
password_hash()string (max_length ≥ 128), text

Birden fazla kural dizi olarak verilir: check: [regex('^[a-z]+$'), enum({'a': 'A', 'b': 'B'})].

NarQL
# hata: age: 125 is above max 120
from('kisiler').insert_one({email: 'a@b.co', age: 125});

int8 en fazla 127 tutar. 130 yazılsaydı hata "does not fit int8" olurdu: tür sınırı kurallardan önce denetlenir.

NarQL
# hata: gender: 7 is not one of 0 (male), 1 (female)
from('kisiler').insert_one({email: 'a@b.co', gender: 7});

nullable ve default#

NarQL
create_schema('notlar')
    .fields({
        'no':      {type: int64, autoincrement: true, primary_key: true},
        'baslik':  {type: string, max_length: 80, nullable: false},
        'durum':   {type: string, max_length: 10, default: 'taslak'},
        'olusma':  {type: timestamp, default: now()}
    })
    .commit();

from('notlar').insert_one({baslik: 'İlk not'});
NarQL
# hata: baslik is required (not nullable)
from('notlar').insert_one({durum: 'yayinda'});

Varsayılan değer de alanın kurallarına uymalıdır; uymayan bir default şema oluşturulurken reddedilir.

Parola alanları#

NarQL
create_schema('hesaplar')
    .fields({
        'kullanici': {type: string, max_length: 40, primary_key: true},
        'parola':    {type: string, check: password_hash()}
    })
    .commit();

from('hesaplar').insert_one({kullanici: 'osman', parola: 'gizli-parola'});
from('hesaplar').fields('*').get();
  • Değer yazılmadan önce Argon2id ile özetlenir; ham parola diske yazılmaz.
  • Sorgu sonuçlarında parola alanları •••••• olarak görünür.
  • Zaten bir Argon2id özeti olan değer (başka bir sistemden aktarım) yeniden özetlenmez.
  • password_hash yalnızca alan oluşturulurken eklenebilir. Var olan bir alana sonradan eklenirse o alandaki değerler özetlenmemiş kalırdı.

Benzersizlik#

Benzersiz bir indeks aynı değerin ikinci kez yazılmasını engeller:

NarQL
from('kisiler').insert_one({email: 'osman@example.com'});
NarQL
# hata: email: value osman@example.com already exists (unique index idx_email)
from('kisiler').insert_one({email: 'osman@example.com'});