Limonatacının sipariş defteri: ilk veritabanın
The lemonade stand order book
Bu derste neler öğreneceksin
- Postgres i Dockerda calistirir
- Ilk tabloyu olusturur
- Ilk 5 satiri ekler
İlk Veritabanın: Postgres + Docker
Bugün gerçek bir production senaryosunun en küçük parçasını kuruyoruz: ilişkisel veritabanı. Bu, neredeyse her modern uygulamanın kalbi. Shopify, Notion, Discord — hepsinin arkasında bir Postgres veya MySQL çalışır. İlk adımı doğru atmak için önce neden container (Docker) kullandığımızı anlayalım.
Neden Docker?
Klasik senaryo: geliştirici bilgisayarında Postgres kurulu, ama başka geliştirici takım arkadaşında çalışmıyor. “Bende çalışıyor” cümlesi yazılım tarihinin en pahalı cümlesi. Docker bu sorunu çözer: veritabanını bir imaj olarak paketlersin, her makinede aynı şekilde ayağa kalkar. “Bende çalışıyor” → “Her yerde çalışıyor”.
Container, bir yalıtılmış süreç olarak düşünülebilir. Kendi dosya sistemi, kendi ağı, kendi ortam değişkenleri var. Bilgisayarındaki diğer şeylere dokunmaz. Veritabanını silmek istediğinde container’ı silmen yeterli, geride iz kalmaz.
Postgres’i Ayağa Kaldır
docker run -d --name pg-limonata \
-e POSTGRES_USER=elif \
-e POSTGRES_PASSWORD=limonata \
-e POSTGRES_DB=limonata_db \
-p 5432:5432 \
postgres:18
Bayrakları tek tek açalım:
-d: detached (arkaplan). Terminal bloke olmaz.--name pg-limonata: container’a isim verir, yoksa Docker rastgele bir isim atar (örn.vigilant_archimedes).-e: environment variable. Veritabanı kullanıcı adı, şifresi, varsayılan DB.-p 5432:5432: port yönlendirme. Sol taraf host (senin bilgisayarın), sağ taraf container.postgres:18: imaj + versiyon. Major versiyonu sabitlemek çok önemli — Postgres 17 ile yazılmış kodu 18’e taşıyınca davranış değişebilir.
Kontrol: docker ps. Çıktıda pg-limonata adında bir satır görmelisin. STATUS sütununda “Up” yazmalı.
Logları görmek için:
docker logs -f pg-limonata
“database system is ready to accept connections” mesajını görünce her şey hazır. Ctrl+C ile çık.
Bağlan: psql
Container çalışıyor. Şimdi içine girelim:
docker exec -it pg-limonata psql -U elif -d limonata_db
exec çalışan bir container’a komut gönderir. -it interaktif terminal. psql Postgres’in CLI istemcisi.
İçeridesin. musteriler tablosu oluşturalım:
CREATE TABLE musteriler (
id SERIAL PRIMARY KEY,
isim TEXT NOT NULL,
icecek TEXT NOT NULL,
fiyat NUMERIC(5,2) NOT NULL CHECK (fiyat >= 0),
tarih DATE NOT NULL DEFAULT CURRENT_DATE
);
Burada üretim kalıpları var:
SERIAL: Auto-incrementing integer. UUID da kullanabilirsin ama SERIAL küçük ve debug dostu.NOT NULL: Boş geçilemez. Veri kalitesinin ilk savunma hattı.CHECK (fiyat >= 0): Negatif fiyat olamaz, DB seviyesinde garanti.DEFAULT CURRENT_DATE: Tarihi unutursan bugünü yazar.NUMERIC(5,2): Ondalıklı sayı.FLOATpara için kullanma — yuvarlama hataları olur.
İlk Satırları Ekle
INSERT INTO musteriler (isim, icecek, fiyat) VALUES
('Ayşe', 'Limonata', 25.00),
('Mehmet', 'Nane Limonata', 30.00),
('Zeynep', 'Çilekli Limonata', 35.00),
('Ali', 'Klasik Limonata', 25.00),
('Elif', 'Buzlu Limonata', 28.00);
Doğrula:
SELECT * FROM musteriler ORDER BY id;
İstersen tablonun şemasını incele:
\d musteriler
Çıktıda sütun tipleri, kısıtlamalar, varsayılanlar görünür. Bu, production debugging’de en çok başvuracağın komutlardan biri.
Container’ı Yönet
Durdurmak için: docker stop pg-limonata. Veriler kaybolmaz, sadece container kapanır. Tekrar başlat: docker start pg-limonata.
Tamamen silmek (veriler dahil!):
docker stop pg-limonata
docker rm pg-limonata
Üretimde veri asla container içinde tutulmaz — bir sonraki derste göreceğimiz volume ile kalıcı diske bağlanır. Şimdilik konteyner durunca verinin de gitmesi beklenen davranış; bu sayede “sıfır kurulum, sıfır artık” elde edersin.
Alıştırma
- Bir musteri ekle: kendi adın, kendi içeceğin, istediğin fiyat.
SELECT COUNT(*) FROM musteriler;çalıştır. 6 görmelisin.docker logs pg-limonata | tail -20ile son logları incele. Çalıştırdığın sorgular orada görünür mü?