Kitaplar / Yöntem Birimler ve Araçlar Kılavuzu / 7. Veritabanı: SQL veritabanları
7. Veritabanı: SQL veritabanları
Veritabanı birimi SQL veritabanlarına tek bir arayüzle bağlanır. Hangi veritabanına bağlanılacağını Bağlan’a verilen adres belirler; programın geri kalanı aynı kalır.
| Adres | Veritabanı | Gerekli sürücü |
|---|---|---|
sqlite:magaza.db |
SQLite dosyası (yoksa oluşur) | Yok; Node.js 22.5+ ve Python ile gelir |
sqlite::bellek: |
Bellekte geçici SQLite | Yok |
postgres://… |
PostgreSQL | npm install pg · pip install pg8000 |
mysql://… |
MySQL ve MariaDB | npm install mysql2 · pip install pymysql |
Sunucu adresinin tamamı postgres://kullanıcı:parola@sunucu:5432/veritabanı biçimindedir; parolada özel karakter varsa Ağ.UrlKodla ile kodlanır. Sürücü JavaScript derleyicisi için projenin klasörüne npm ile, Python yorumlayıcısı için pip ile kurulur.
program VeritabanıÖrneği
{ Veritabanı birimi: tablo oluşturma, parametreli sorgular ve işlem (transaction).
'sqlite::bellek:' geçici bir veritabanıdır; kalıcı dosya için 'sqlite:magaza.db' yazın. }
kullan Veritabanı
değişken
vt: herhangi
satır: sözlük
başla
vt := Bağlan('sqlite::bellek:')
vt.Çalıştır('CREATE TABLE urun (no INTEGER PRIMARY KEY, ad TEXT NOT NULL UNIQUE, fiyat REAL, adet INTEGER)')
vt.Çalıştır('INSERT INTO urun (ad, fiyat, adet) VALUES (?, ?, ?)', ['defter', 12.5, 40])
vt.Çalıştır('INSERT INTO urun (ad, fiyat, adet) VALUES (?, ?, ?)', ['kalem', 4, 120])
yaz('Son eklenen ürünün numarası: ' + vt.SonKimlik, 1)
{ Değerler SQL metnine eklenmez, '?' ile verilir: kötü niyetli girdi yalnızca bir metin olarak kalır }
vt.Çalıştır('INSERT INTO urun (ad, fiyat, adet) VALUES (?, ?, ?)', ['x''); DROP TABLE urun; --', 1, 1])
yaz('Ürün sayısı: ' + vt.TekDeğer('SELECT COUNT(*) FROM urun'), 1)
vt.Sorgula('SELECT ad, fiyat * adet AS tutar FROM urun WHERE fiyat > ? ORDER BY ad', [3]) içindeki her satır için
yaz(satır['ad'] + ': ' + satır['tutar'], 1)
{ İşlem: iki değişiklik ya birlikte kalıcı olur ya da hiçbiri }
vt.İşlemBaşlat
vt.Çalıştır('UPDATE urun SET adet = adet - ? WHERE ad = ?', [5, 'defter'])
vt.Çalıştır('UPDATE urun SET adet = adet + ? WHERE ad = ?', [5, 'kalem'])
vt.Onayla
satır := vt.TekSatır('SELECT ad, adet FROM urun WHERE ad = ?', ['defter'])
yaz(satır, 1)
dene
vt.Çalıştır('INSERT INTO urun (ad) VALUES (?)', ['defter'])
yakala (h)
yaz(h.mesaj, 1)
bitir
vt.Kapat
bitir.Son eklenen ürünün numarası: 2
Ürün sayısı: 3
defter: 500.0
kalem: 480.0
['ad': 'defter', 'adet': 35]
Veritabanı hatası: UNIQUE constraint failed: urun.adBağlan bir bağlantı nesnesi döndürür:
| Üye | Ne yapar |
|---|---|
vt.Çalıştır(sql [, parametreler]) |
Değiştiren komutları çalıştırır; etkilenen satır sayısını döndürür |
vt.Sorgula(sql [, parametreler]) |
Satırları sözlük listesi olarak döndürür; anahtarlar sütun adlarıdır |
vt.TekSatır(sql [, parametreler]) |
İlk satırı sözlük olarak döndürür; satır yoksa boş |
vt.TekDeğer(sql [, parametreler]) |
İlk satırın ilk sütununu döndürür; satır yoksa boş |
vt.SonKimlik |
Son eklenen satırın otomatik numarası (PostgreSQL’de bunun yerine INSERT … RETURNING kullanılır) |
vt.İşlemBaşlat · vt.Onayla · vt.GeriAl |
İşlem (transaction) |
vt.Kapat · vt.Açık · vt.Tür |
Bağlantıyı kapatır · açık mı · 'sqlite', 'postgres' ya da 'mysql' |
Değerleri her zaman parametreyle vermeniz gerekir. Sorgudaki ? işaretlerinin yerine parametreler listesindeki değerler sırayla konur; değer SQL metninin parçası olmaz, bu yüzden kullanıcıdan gelen girdi sorguyu değiştiremez (SQL enjeksiyonu). Yer tutucu üç veritabanında da ? işaretidir. Tablo ve sütun adları parametre olamaz; bir adı değişkenden almak zorundaysanız SqlAdı(ad) onu denetleyip tırnaklar.
Tipler. Tamsayı sütunları tamsayı, kesirli ve NUMERIC sütunları ondalık, metin sütunları metin, NULL ise boş olarak gelir. PostgreSQL’in BOOLEAN tipi mantıksal olur; SQLite ve MySQL’de mantıksal değerler 0 ve 1’dir. Tarih ve saat sütunları veritabanının yazdığı metin olarak gelir ('2026-11-11 10:30:00'); Takvim.TarihOku ile zamana çevrilebilir.
SQL’in kendisi veritabanından veritabanına biraz değişir (otomatik numara SQLite’ta INTEGER PRIMARY KEY, PostgreSQL’de SERIAL, MySQL’de AUTO_INCREMENT ile bildirilir); birim sorguları çevirmez, yalnızca bağlantıyı, yer tutucuları ve tipleri ortaklaştırır. Veritabanı hataları Veritabanı hatası: … iletisiyle fırlatılır ve dene … yakala ile yakalanabilir. Parolayı programın içine yazmak yerine Sistem.Ortam('VT_ADRESI') ile ortam değişkeninden okumanızı öneririz.