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

create_schema

Alanlar, türler, uzunluklar, karakter kodlaması ve indeksler.

Bir şema bir tabloyu tanımlar: alanları, türleri, kuralları ve indeksleri.

NarQL
create_schema('uyeler')
    .fields({
        'id':       {type: string, max_length: 32, guid: true, primary_key: true},
        'name':     {type: string, max_length: 50},
        'surname':  {type: string, max_length: 50, encoding: latin5},
        'nickname': {type: string, max_length: 20, default: '🍉'},
        'email':    {type: string, max_length: 100, index: {unique: true, name: 'idx_email'}},
        'age':      {type: int8},
        'seq':      {type: int64, autoincrement: true},
        'birth':    {type: date, format: 'dd.mm.yyyy'},
        'balance':  {type: decimal, precision: 12, scale: 2, default: 0}
    })
    .commit();
  • .commit() yoksa şema yalnızca doğrulanır. Hatalar satır ve sütunla gelir.
  • Alan sırası korunur. fields('*') alanları bu sırayla döndürür.
  • Her alana tekrar kullanılmayan bir kimlik verilir. Bu sayede alan silinip yeni bir alan eklendiğinde eski kayıtlar karışmaz.
  • Adlar küçük harf snake_case olmalı ve en fazla 63 karakter olabilir. privileges adı ve nar_ ile başlayan adlar sisteme ayrılmıştır.

Şemayı silmek için:

NarQL
drop_schema('uyeler').commit();

Silmek, tablonun bütün sayfalarını boşa çıkarır.

Türler#

GrupTürler
Tamsayıint8 int16 int32 int64 · uint8 uint16 uint32 uint64
Ondalıklıfloat32 float64 · decimal (precision, scale ile)
Metinstring (varsayılan max_length: 255) · text (sınırsız)
Mantıksalbool
Zamandate datetime time timestamp
Kimlikguid
İkilibinary blob

Tek başına int geçersizdir; boyut yazılmalıdır. int8 en fazla 127 tutar, yanlışlıkla seçildiğinde değer taşar.

NarQL
# hata: 'int' is ambiguous: write the size, e.g. int8 (−128..127), int32 or int64
create_schema('x').fields({'age': {type: int}});

Alan seçenekleri#

SeçenekNe yapar
max_lengthstring ve binary için üst sınır. Karakter sayar, bayt değil.
encodingutf8 (varsayılan), ascii, latin1, latin5. Bkz. aşağısı.
precision, scaledecimal için toplam ve ondalık basamak sayısı.
formatTarih alanlarının giriş ve gösterim biçimi, örneğin 'dd.mm.yyyy'.
nullableVarsayılan true. Birincil anahtar ile autoincrement ve guid alanlarında varsayılan false.
defaultDeğer, now(), guid() ya da null.
primary_keyEn fazla bir alan. Verilmezse gizli bir satır kimliği kullanılır.
autoincrementTamsayı alanlar için. guid ile birlikte kullanılamaz.
guidstring (max_length ≥ 32) ya da guid türü için kimlik üretir.
indextrue ya da {name, unique}. Şimdilik yalnızca btree.
checkDoğrulama kuralları. Bkz. Doğrulama.

Karakter kodlaması ve emoji#

Metin her zaman UTF-8 olarak işlenir. encoding, bir alanın hangi karakterleri kabul ettiğini belirler:

KodlamaKabul eder
utf8Unicode'un tamamı, emoji dahil: 🍉 👩‍💻 🇹🇷
asciiYalnızca 7 bitlik karakterler (kod, slug, ülke kodu)
latin1ISO-8859-1 ile gösterilebilenler
latin5ISO-8859-9 ile gösterilebilenler: Türkçe ğ ı ş İ Ğ Ş dahil
NarQL
create_schema('etiketler')
    .fields({
        'slug': {type: string, max_length: 40, encoding: ascii, primary_key: true},
        'ad':   {type: string, max_length: 40}
    })
    .commit();

from('etiketler').insert_one({slug: 'nar-suyu', ad: 'Nar suyu 🍹'});
NarQL
# hata: character 'ç' is not allowed in ascii
from('etiketler').insert_one({slug: 'çay', ad: 'Çay'});

max_length Unicode kod noktası sayar. 🍉 bir karakterdir. 👩‍💻 ise üç karakterdir (iki emoji ve aradaki birleştirici).

Tarih biçimi#

Hem şemadaki format hem de FORMAT ve TO_DATE fonksiyonları aynı belirteçleri kullanır:

BelirteçAnlamıBelirteçAnlamı
yyyyyıl (2026)hhsaat (00–23)
yyyıl (26)iidakika
mmaysssaniye
ddgün

MM ve HH sırasıyla mm ve hh ile aynı anlamdadır. Ayraç olarak - / . : , T ve boşluk kullanılabilir. Biçim verilmezse ISO 8601 kullanılır. Bir date alanına saat belirteci yazılamaz.

İndeksler#

Birincil anahtar otomatik olarak indekslenir (pk_<şema>). Diğer alanlar için:

NarQL
create_schema('siparisler')
    .fields({
        'no':     {type: int64, autoincrement: true, primary_key: true},
        'uye_id': {type: string, max_length: 32, index: true},
        'kod':    {type: string, max_length: 20, index: {unique: true, name: 'idx_siparis_kod'}}
    })
    .commit();

where içinde birincil anahtar ya da indeksli bir alan eşitlikle aranırsa tablo taranmaz, doğrudan indeksten okunur. Benzersiz indekslerde null değerler birbirine eşit sayılmaz; birden fazla satır null olabilir.