İçeriğe geç

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.

Yöntem
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.
Çıktı
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.ad

Bağ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.