Go API
NarDB'yi bir Go programına gömmek; Exec, parametreler ve hata değerleri.
NarDB Shell, ileride gelecek sunucu ve LexerLang connector'ı aynı Go paketini kullanır. Hiçbiri depolama katmanına doğrudan erişmez.
import "nardb"
db, err := nardb.Open("./veri/magaza.ndbc", nardb.Options{})
if err != nil {
return err
}
defer db.Close()
res, err := db.Exec(ctx, `
from('uyeler')
.where({'email': $1})
.fields('name', FORMAT('birth_date', 'dd-mm-yyyy'));
`, "osman@example.com")
if err != nil {
return err
}
for _, row := range res[0].Rows {
fmt.Println(row[0], row[1])
}Açma kipleri#
Options.Mode | Dosya varsa | Dosya yoksa |
|---|---|---|
nardb.OpenOrCreate (varsayılan) | açar | oluşturur |
nardb.CreateNew | fs.ErrExist | oluşturur |
nardb.OpenExisting | açar | fs.ErrNotExist |
Aynı dosyayı ikinci kez açmak, aynı süreç içinde bile nardb.ErrLocked döndürür. Bir süreçte tek bir *nardb.DB paylaşılmalıdır; DB eşzamanlı kullanıma uygundur.
Exec#
func (db *DB) Exec(ctx context.Context, script string, args ...any) ([]Result, error)- İfadeleri sırayla çalıştırır ve ilk hatada durur. Dönen sonuçlar hataya kadar çalışmış ifadelerindir.
$1,$2yerineargsdeğerleri konur; değerler sorgu metnine gömülmez.- Aynı anda en fazla
max_concurrent_querieskadarExecçalışır.query_timeout,ctx'e ek bir süre sınırı koyar.
type Result struct {
Statement string
Message string
Columns []string
Rows [][]string
RowsAffected int
}Satırlar şimdilik metin olarak döner. Tarihler alanın biçimiyle, parola alanları •••••• olarak gelir. Türlü değerler döndüren bir API ilerleyen sürümlerde eklenecek.
Hatalar konum taşır: line 2, col 17: 'int' is ambiguous: ....
Diğer metotlar#
| Metot | Ne yapar |
|---|---|
Schemas() · DescribeSchema(ad) | Şemaları ve bir şemanın alanlarını, indekslerini ve dağıtımını döndürür |
CreateUser(ad, parola) · VerifyUser · Users() | Kullanıcılar |
Pool() · SetPool(p) | Havuz ayarları |
Stats() | Dosya ve sayfa istatistikleri, DatabaseID |
Hata değerleri#
errors.Is ile karşılaştırılır: ErrNotDatabase, ErrCorrupt, ErrFormatVersion, ErrUnsupportedFeature, ErrLocked, ErrUnsupportedPlatform, ErrClosed, ErrNotImplemented.
LexerLang#
LexerLang connector'ı henüz yazılmadı. Planlanan kullanım şu:
use nardb
$db = $app.services.once("nardb", func()
return new nardb({path: path.pwd + "/data/app.ndbc"})
end func)
$uye = $db.query("from('uyeler').where({'email': $1}).fields('name').limit(1);", $eposta)services.once kullanılmasının sebebi şu: LexerLang sayfaları her istekte yeniden çalışır. Veritabanı dosyasını istek başına açıp kapatmak hem yavaş olur hem de "dosyanın tek sahibi" kuralıyla çakışır.