SQLite 3 Veritabanı Yönetimi ve Kullanımı
SQLite 3, yaygın olarak kullanılan gömülü bir ilişkisel veritabanı yönetim sistemidir. Hafif yapısı, bağımsız bir sunucu sürecine ihtiyaç duymaması ve tüm veriyi tek bir dosyada saklaması sayesinde, mobil uygulamalar, gömülü sistemler, küçük masaüstü uygulamaları ve yerel geliştirme ortamları için ideal bir seçimdir. SQLite 3, yönetimi ve kullanımı son derece kolay olan bir çözümdür. Bu makale, ServBay kullanıcılarının ServBay ortamında SQLite 3 veritabanını etkin bir şekilde nasıl yöneteceğini ve kullanacağını; kurulum doğrulaması, bağlantı, temel işlemler, veri yedekleme ve geri yükleme, performans optimizasyonu ve güvenlik uyarılarının yanı sıra PHP ve Node.js için kod örnekleriyle birlikte ayrıntılı olarak ele almaktadır.
Genel Bakış
ServBay, kapsamlı bir yerel Web geliştirme ortamı olarak SQLite 3 ve ilgili geliştirme kütüphanelerini dahili olarak barındırır; komut satırı veya ServBay’in desteklediği diller (PHP, Node.js, Python, Go vb.) üzerinden doğrudan erişim ve kullanım sağlayabilirsiniz, ek bir kurulum gerekmez. Bu sayede, yerel geliştirmede SQLite 3’ü kullanma süreçleri oldukça basitleştirilmiştir.
SQLite 3'ün Kurulumu ve Yapılandırması
ServBay, varsayılan olarak SQLite 3’ü entegre bir şekilde sunar; dolayısıyla ekstra bir kurulum adımına ihtiyacınız yoktur. SQLite 3’ün çalıştırılabilir dosyası ve kütüphaneleri ServBay paketine dahildir.
SQLite 3 Kurulumunu Doğrulama
ServBay’in sunduğu SQLite 3’ü kullanıma hazır olup olmadığını ve sürümünü doğrulamak için terminalde aşağıdaki komutu çalıştırabilirsiniz:
bash
sqlite3 --version
1
Komutla birlikte SQLite 3’ün sürüm numarası (ör. 3.41.2 2023-03-26 11:52:19 ...
) görüntüleniyorsa, SQLite 3 başarılı şekilde entegre edilmiştir ve hazırdır.
SQLite 3 Veritabanı Oluşturma ve Bağlantı
Bir SQLite 3 veritabanı temelde bir dosyadır. Varsayılan olarak ServBay, veritabanı dosyalarının /Applications/ServBay/db/sqlite
dizininde tutulmasını önerir; ancak bu zorunlu değildir, proje ihtiyacınıza göre başka bir konum da seçebilirsiniz. Veritabanı oluşturma veya bağlantısı genellikle sqlite3
komut satırı aracı veya çeşitli programlama dillerinin sağladığı SQLite kütüphaneleriyle gerçekleşir.
Komut Satırı Aracı ile Bağlantı
sqlite3
komut satırı aracı, SQLite 3 veritabanı yönetiminin en hızlı ve doğrudan yoludur.
Veritabanı Oluşturma veya Bağlantı Kurma: Terminalde aşağıdaki komutu yürütün. Belirttiğiniz yolda veritabanı dosyası yoksa,
sqlite3
otomatik olarak yeni bir dosya oluşturacak; eğer dosya zaten varsa ona bağlanacaktır.bashsqlite3 /Applications/ServBay/db/sqlite/servbay.db
1(Bu örnekte, marka bütünlüğü için veritabanı dosyasına
servbay.db
adını verdik.)sqlite>
istemine geçince SQL komutları ya da.commands
yazarak çalışabilirsiniz.SQLite 3’ten Çıkış:
sqlite>
isteminde aşağıdaki komutu girerek araçtan çıkabilirsiniz.sql.exit
1
Programlama Dili ile Bağlantı
ServBay’in desteklediği dillerin çoğu SQLite 3 veritabanına erişim ve işlem imkanına sahiptir. Aşağıda PHP ve Node.js örnekleri sunulmaktadır.
PHP Örneği
ServBay genellikle, PHP için SQLite 3 eklentisi (php-sqlite3) ile birlikte gelir. Dahili SQLite3
sınıfı ile veritabanına bağlanabilirsiniz.
php
<?php
// Veritabanı dosya yolunu belirtin, ServBay'in db/sqlite dizinine kaydetmeniz önerilir
$database_file = '/Applications/ServBay/db/sqlite/servbay.db';
// SQLite 3 veritabanına bağlanma
// Dosya yoksa, SQLite3 yapıcı yeni dosya oluşturur
$db = new SQLite3($database_file);
if (!$db) {
die("SQLite 3 veritabanına bağlanılamadı: " . $db->lastErrorMsg());
}
echo "SQLite 3 veritabanına başarıyla bağlanıldı: " . $database_file . "\n";
// Tabloyu oluştur (yoksa)
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE
)";
$db->exec($create_table_sql);
echo "'users' tablosu kontrol edildi veya oluşturuldu.\n";
// Veri ekleme
$name = 'ServBay Demo User';
$email = '[email protected]';
$insert_sql = $db->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
$insert_sql->bindValue(':name', $name, SQLITE3_TEXT);
$insert_sql->bindValue(':email', $email, SQLITE3_TEXT);
if ($insert_sql->execute()) {
echo "Veri başarıyla eklendi.\n";
} else {
echo "Veri ekleme başarısız: " . $db->lastErrorMsg() . "\n";
}
// Veri sorgulama
$query_sql = "SELECT id, name, email FROM users";
$result = $db->query($query_sql);
if ($result) {
echo "Sorgu sonucu:\n";
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
echo "ID: " . $row['id'] . ", Adı: " . $row['name'] . ", E‑posta: " . $row['email'] . "\n";
}
} else {
echo "Sorgu başarısız: " . $db->lastErrorMsg() . "\n";
}
// Veritabanı bağlantısını kapat
$db->close();
unset($db); // Kaynakları serbest bırak
echo "Veritabanı bağlantısı kapatıldı.\n";
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Node.js Örneği
Node.js ortamında SQLite 3 kullanmak için sqlite3
npm paketini kurmalısınız. Terminalde proje dizininize geçip aşağıdaki komutu çalıştırın:
bash
npm install sqlite3
1
Daha sonra aşağıdaki gibi veritabanına bağlanabilir ve işlem yapabilirsiniz:
javascript
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
// Veritabanı dosya yolu belirtildi, path.join ile platformlar arası uyumluluk sağlandı
const dbPath = path.join('/Applications/ServBay/db/sqlite', 'servbay.db');
// SQLite 3 veritabanına bağlan
// Dosya yoksa, sqlite3.Database yenisini oluşturur
let db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
if (err) {
console.error('SQLite 3 veritabanına bağlanılamadı:', err.message);
} else {
console.log('Veritabanına başarıyla bağlanıldı.');
}
});
// Komutları sıralı çalıştırmak için serialize kullandık
db.serialize(() => {
// Tabloyu oluştur (yoksa)
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE
)`, (err) => {
if (err) {
console.error('Tablo oluşturulamadı:', err.message);
} else {
console.log('"users" tablosu kontrol edildi veya oluşturuldu.');
}
});
// Veri ekleme
const name = 'ServBay Demo User';
const email = '[email protected]';
db.run(`INSERT INTO users (name, email) VALUES (?, ?)`, [name, email], function(err) {
if (err) {
// SQLITE_CONSTRAINT: benzersizlik hatası kodu
if (err.errno === 19) { // SQLITE_CONSTRAINT
console.warn(`Kullanıcı '${name}' (${email}) zaten mevcut, ekleme atlandı.`);
} else {
console.error('Veri ekleme başarısız:', err.message);
}
} else {
console.log(`Bir satır başarıyla eklendi, ID: ${this.lastID}`);
}
});
// Veri sorgulama
db.all(`SELECT id, name, email FROM users`, [], (err, rows) => {
if (err) {
throw err;
}
console.log('Sorgu sonucu:');
rows.forEach((row) => {
console.log(`ID: ${row.id}, Adı: ${row.name}, E‑posta: ${row.email}`);
});
});
});
// Veritabanı bağlantısını kapatma
db.close((err) => {
if (err) {
console.error('Veritabanı bağlantısı kapatılamadı:', err.message);
} else {
console.log('Veritabanı bağlantısı kapatıldı.');
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Not: Gerçek projede lütfen veritabanı dosya yolu güvenliğini sağlayın ve hata/çoklu erişim konularında gerekli önlemleri alın.
Veritabanı Yönetimi
Temel SQL İşlemleri
SQLite 3 veritabanına bağlandıktan sonra standart SQL komutları ile veri yönetimi yapılabilir. İşte yaygın bazı işlemlere örnekler:
Tablo Oluşturma: Veri yapısını tanımlayın.
sqlCREATE TABLE products ( product_id INTEGER PRIMARY KEY AUTOINCREMENT, product_name TEXT NOT NULL, price REAL DEFAULT 0.00 );
1
2
3
4
5Veri Ekleme: Tabloya yeni kayıt ekleyin.
sqlINSERT INTO products (product_name, price) VALUES ('ServBay T-Shirt', 19.99); INSERT INTO products (product_name, price) VALUES ('ServBay Sticker Pack', 4.99);
1
2Veri Sorgulama: Kayıtları sorgulayın.
sqlSELECT * FROM products; SELECT product_name, price FROM products WHERE price > 10.00;
1
2Veri Güncelleme: Mevcut kayıtları değiştirin.
sqlUPDATE products SET price = 24.99 WHERE product_name = 'ServBay T-Shirt';
1Veri Silme: Kayıtları tablodan kaldırın.
sqlDELETE FROM products WHERE product_id = 1; DELETE FROM products; -- Tablo içindeki tüm verileri siler
1
2Tablo Silme: Tabloyu ve verilerini tamamen kaldırma.
sqlDROP TABLE products;
1
Bu komutlar doğrudan sqlite3
komut satırı aracında ya da programlama dillerinin SQLite kütüphaneleri üzerinden çalıştırılabilir.
Yedekleme ve Geri Yükleme
SQLite 3’te yedekleme ve geri yükleme çok pratiktir; çünkü tüm veritabanı tek bir dosyadır.
Veritabanı Yedekleme
En basit yol dosyayı kopyalamaktır. ServBay, yedeklerin /Applications/ServBay/backup/sqlite
dizininde tutulmasını önerir.
Komut satırı ile yedekleme işlemi:
bash
# Yedek dizini oluştur (eğer yoksa)
mkdir -p /Applications/ServBay/backup/sqlite
# Veritabanı dosyasını kopyalayıp yedekle
# Dosya ismine tarih/saat ekleyerek farklı yedekleri kolayca ayırt edebilirsiniz
cp /Applications/ServBay/db/sqlite/servbay.db /Applications/ServBay/backup/sqlite/servbay_$(date +%Y%m%d_%H%M%S).db
1
2
3
4
5
6
2
3
4
5
6
Ayrıca sqlite3
komut satırında .backup
komutuyla sıcak yedek (açıkken yedekleme) de yapılabilir; ancak yerel geliştirme ortamı için dosyayı doğrudan kopyalamak genellikle yeterlidir.
Veritabanı Geri Yükleme
Yedek dosyasını geri yüklemek için, yedeği kaynak dizine geri kopyalamanız yeterlidir. Geri yükleme öncesi, veritabanına erişebilecek tüm uygulamaları veya ServBay’i durdurmanız, dosya kilidi veya veri tutarsızlığı riskini önler.
bash
# Diyelim ki en yeni yedek dosyasını geri yüklemek istiyorsunuz
# En yeni yedek dosyasını bul
LATEST_BACKUP=$(ls -t /Applications/ServBay/backup/sqlite/servbay_*.db | head -n 1)
# Yedek dosyası varsa, işlem başlasın
if [ -z "$LATEST_BACKUP" ]; then
echo "Hata: Hiçbir SQLite yedek dosyası bulunamadı."
exit 1
fi
echo "Geri yüklenecek yedek dosya: $LATEST_BACKUP"
# İlgili servis veya uygulamaları durdurun... (ServBay yapılandırmanıza göre değişir)
# Örneğin, PHP uygulamanız kullanıyorsa, PHP süreçlerinin kapalı olduğuna emin olun
# Yedek dosyayı var olan veritabanı dosyasının üstüne kopyalayın
cp "$LATEST_BACKUP" /Applications/ServBay/db/sqlite/servbay.db
echo "Veritabanı geri yüklendi."
# Servislerinizi veya uygulamalarınızı başlatabilirsiniz...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Önemli Uyarı: Dosyayı doğrudan kopyalamak, veritabanı aktif olarak yazılıyorken yapılırsa veri bozulmasına yol açabilir. Dosya üzerinde aktif yazma işlemi varsa, önce ilgili servisleri durdurun veya daha gelişmiş sıcak yedek için SQLite’ın API’lerini kullanmayı değerlendirin.
Performans Optimizasyonu
SQLite 3, birçok PRAGMA komutu ve indeksleme stratejisiyle performans artışı sağlar.
İndeks Optimizasyonu
Sorgularda sıkça kullanılan sütunlara (özellikle WHERE
, JOIN
, ORDER BY
) indeks eklemek sorgu hızını ciddi şekilde artırır.
sql
-- users tablosunda email sütununa benzersiz indeks tanımlama
CREATE UNIQUE INDEX idx_users_email ON users(email);
-- products tablosunda product_name sütununa normal indeks tanımlama
CREATE INDEX idx_products_name ON products(product_name);
1
2
3
4
5
2
3
4
5
Sorgu Optimizasyonu
EXPLAIN QUERY PLAN
komutuyla SQLite’ın SQL sorgularınızı nasıl çalıştırdığını görebilir, darboğazları tespit edebilirsiniz.
sql
EXPLAIN QUERY PLAN SELECT * FROM users WHERE email = '[email protected]';
EXPLAIN QUERY PLAN SELECT product_name FROM products ORDER BY price DESC;
1
2
2
Çıktıdan, indekslerin kullanılıp kullanılmadığını ve tam tablo taraması (SCAN TABLE) olup olmadığını analiz edin.
Yapılandırma Optimizasyonu (PRAGMA)
PRAGMA komutları ile SQLite 3’ün çalışma zamanını özelleştirebilirsiniz. Sık kullanılan performans odaklı bazı PRAGMA’lar:
PRAGMA journal_mode;
/PRAGMA journal_mode = mode;
: Kayıt günlükleme modunu belirler.WAL
(Write-Ahead Logging), çoklu okuma ve yazma işlemlerinin olduğu durumda en iyi performansı sunar. Genellikle varsayılan modDELETE
veyaTRUNCATE
olabilir.WAL
olarak ayarlamak, yazma kilidi ihtimalini azaltır.sqlPRAGMA journal_mode = WAL;
1PRAGMA synchronous;
/PRAGMA synchronous = level;
: Dosya sistemiyle eşzamanlılığı kontrol eder.OFF
(veya0
) olarak ayarlamak, yüksek yazma performansı sunar fakat sistem çökmesi durumunda son değişiklikler kaybolabilir.FULL
(veya1
) veyaNORMAL
(veya2
) daha yüksek veri güvenliği ama daha düşük hız sunar. Yerel geliştirme için geneldeOFF
tercihi yapılabilir.sqlPRAGMA synchronous = OFF;
1PRAGMA cache_size;
/PRAGMA cache_size = pages;
: Bellekte tutulacak veritabanı sayfası adedini belirler. Bunu artırmak disk okuma/yazmasını azaltıp performansı yükseltir, ancak daha fazla bellek gereksinimi doğurur.sqlPRAGMA cache_size = -20000; -- 20MB önbellek (negatif değer KB anlamındadır)
1
Not: PRAGMA ayarları genellikle yalnızca mevcut bağlantıyı etkiler. Kalıcı olmasını istiyorsanız, her veritabanı bağlantısı kurulduğunda veya uygulama başlatılırken ayarları yeniden uygulamalısınız.
Güvenlik Yönetimi
Her ne kadar SQLite 3 bir dosya veritabanı olsa da, yerel geliştirme ortamında bazı temel güvenlik önlemlerine dikkat etmek gerekir.
Dosya İzinleri
Veritabanı dosyasının işletim sistemi izinlerinin doğru ayarlandığından emin olun. Sadece ServBay’in çalıştığı kullanıcıya veya ilgili geliştirme süreçlerine okuma/yazma izni verilmelidir.
bash
# Örnek: Dosya sahibi olarak mevcut kullanıcıyı ayarla ve sadece sahibine okuma/yazma izni tanımla
# ServBay’i hangi kullanıcı çalıştırıyorsa ona göre güncelleyin
chmod 600 /Applications/ServBay/db/sqlite/servbay.db
1
2
3
2
3
Veri Şifreleme
SQLite 3 yerleşik dosya şifreleme sağlamaz. Yerel geliştirme ortamınızda hassas veri kullanıyorsanız ve veritabanı dosyasını şifrelemek istiyorsanız, SQLCipher gibi şifreleme destekli SQLite uzantılarını değerlendirin. Bunun için ek kütüphane kurulumları ve özel açma/yazma işlemleri gerekmektedir.
Sıkça Sorulan Sorunlar ve Çözümleri
SQLite 3 Veritabanına Bağlanılamıyor
- Veritabanı Dosya Yolunu Kontrol Edin: Bağlantı dizesinde veya terminalde belirttiğiniz dosya yolunun doğru olduğundan ve belirtilen konumda dosyanın var olduğundan emin olun.
- Dosya İzinlerini Kontrol Edin: ServBay’in çalıştığı kullanıcı veya terminal kullanıcınızın veritabanı dosyasına okuma/yazma izninin olup olmadığını kontrol edin.
ls -l /Applications/ServBay/db/sqlite/servbay.db
ile izinleri görüntüleyebilir, gerekirsechmod
veyachown
komutlarıyla güncelleyebilirsiniz. - Veritabanı Dosyası Bozulmuş Olabilir mi?
sqlite3
komut satırı aracıyla dosyaya bağlanmayı deneyin. Hata veya bağlantı başarısızlığı durumunda dosya bozulmuş olabilir; bir yedekten geri yüklemeyi değerlendirin.
Veritabanı Kilit Sorunları (Database is locked)
SQLite 3 tüm veritabanı dosyasını yazma sırasında kilitler. Eğer başka bir işlem veri yazma sırasında ek yazma veya belirli okuma işlemleri yapmaya çalışırsa (seçilen günlük moduna göre), kilitleme hataları oluşabilir.
Eş Zamanlı Erişimi Kontrol Edin: Aynı anda birden fazla uygulama, script veya terminal süreci aynı veritabanı dosyasına yazıyorsa bu kilitlenmelere sebep olabilir. Yerel geliştirmede genelde birden fazla geliştirme sunucusu veya script aynı veritabanını kullanıyorsa ortaya çıkar.
WAL Modunu Kullanma:
PRAGMA journal_mode = WAL;
etkinleştirerek eş zamanlı okuma/yazma işlemlerinizi büyük ölçüde rahatlatabilirsiniz. WAL modu, yazma işlemleri sırasında birden fazla okuma işlemini mümkün kılarak kilitlenme riskini azaltır. Bağlantı kurulduğunda PRAGMA’yı uygulamanız önerilir.Kilit Hatalarını Yönetmek: Programlarınızda veri tabanı kilit hatası aldığınızda, hatada hemen başarısız olmak yerine kısa bir süre bekleyip işlemi tekrar denemek için bir döngü ekleyin. Çoğu SQLite kütüphanesi, hata dönmeden önce otomatik olarak tekrar deneme için “busy timeout” ayarını destekler.
Örneğin, Node.js
sqlite3
kütüphanesinde şöyle ayarlayabilirsiniz:javascriptdb.configure("busyTimeout", 5000); // Meşgulken 5000 milisaniye (5 sn) bekle
1PHP
SQLite3
sınıfında doğrudanbusyTimeout
metodu yoktur; kendi mantığınızla tekrar deneme döngüsü yazmalı ya da mümkünse düşük seviyelisqlite_busy_timeout
fonksiyonunu kullanmalısınız.
Sonuç
ServBay, geliştiriciler için özel olarak tasarlanmış yerel bir Web geliştirme ortamı olarak, kolay ve güçlü SQLite 3 desteğiyle birlikte gelir. Bu makaledeki kapsamlı bilgilerle artık ServBay ortamında SQLite 3 kurulumu doğrulama, bağlantı, temel yönetim, verimli yedekleme/geri yükleme, performans optimizasyonu ve temel güvenlik önlemlerini öğrenmiş oldunuz. SQLite 3’ün hafifliği ve kullanışlılığı, yerel geliştirme, test ve küçük çaplı projelerinizde veritabanı ihtiyacınız için harika bir tercihtir. ServBay’in sunduğu diğer araç zincirleriyle (PHP, Node.js, Python, Go ve çeşitli web sunucuları ile veritabanları) birlikte karmaşık uygulamaları kolaylıkla inşa edebilir ve test edebilirsiniz.