Python İle Sqlite Veritabanı Kullanarak Stok Takip Sistemi Nasıl Yapılır?

Python İle Sqlite Veritabanı Kullanarak Stok Takip Sistemi Nasıl Yapılır?
Python İle Sqlite Veritabanı Kullanarak Stok Takip Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce sisteminizde Python 3.10 veya daha güncel bir sürümün yüklü olduğundan emin olmalısınız. Python'ın standart kütüphanesi içerisinde gelen sqlite3 modülü, harici bir kurulum gerektirmez. Bu, projenizi taşınabilir kılar ve karmaşık veritabanı sunucuları kurmanıza gerek kalmadan yerel bir dosya üzerinde çalışmanıza olanak tanır.

  • Python 3.x: Temel çalışma ortamınız.
  • IDE: VS Code veya PyCharm gibi bir metin düzenleyici.
  • Temel Bilgi: Python değişkenleri, döngüler ve fonksiyonlar hakkında temel bilgi.

Çalışma ortamınızı hazırladıktan sonra, projeniz için bir klasör oluşturun ve içerisinde stok_takip.py adında bir dosya oluşturarak kodlamaya başlayın.

Veritabanı Bağlantısı ve Tablo Oluşturma

İlk adım, veritabanı dosyamızı oluşturmak ve stok bilgilerini tutacak tablomuzu tanımlamaktır. Sqlite, verileri tek bir dosya içerisinde tutar. Veritabanı bağlantısı kurarken connect() metodunu kullanırız. Tablo oluştururken ise SQL'in CREATE TABLE IF NOT EXISTS komutu, tablo daha önce oluşturulmuşsa hata almamızı engeller.

import sqlite3

def veritabani_baglan():
    # 'stoklar.db' dosyası yoksa oluşturulur
    baglanti = sqlite3.connect("stoklar.db")
    imlec = baglanti.cursor()
    # Ürün tablosunu oluşturuyoruz
    imlec.execute("""
        CREATE TABLE IF NOT EXISTS urunler (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            urun_adi TEXT NOT NULL,
            miktar INTEGER NOT NULL,
            fiyat REAL NOT NULL
        )
    """)
    baglanti.commit()
    return baglanti

baglanti = veritabani_baglan()
print("Veritabanı ve tablo başarıyla hazırlandı.")

Bu kod bloğu, stoklar.db adında bir dosya oluşturur ve içine urunler tablosunu ekler. AUTOINCREMENT özelliği, her yeni ürün için otomatik bir ID numarası atanmasını sağlar.

Ürün Ekleme ve SQL Injection Koruması

Veritabanına veri eklerken en kritik konu güvenliktir. Kullanıcıdan gelen verileri doğrudan sorgu içerisine yazmak, SQL Injection saldırılarına kapı aralar. Bu nedenle, her zaman parametreli sorgular (placeholder) kullanmalıyız. Python'daki ? işareti, verilerin güvenli bir şekilde veritabanına işlenmesini sağlar.

def urun_ekle(urun_adi, miktar, fiyat):
    baglanti = sqlite3.connect("stoklar.db")
    imlec = baglanti.cursor()
    # Parametreli sorgu kullanımı (Güvenli yöntem)
    sorgu = "INSERT INTO urunler (urun_adi, miktar, fiyat) VALUES (?, ?, ?)"
    imlec.execute(sorgu, (urun_adi, miktar, fiyat))
    baglanti.commit()
    baglanti.close()
    print(f"{urun_adi} başarıyla stoklara eklendi.")

# Örnek kullanım
urun_ekle("Laptop", 10, 25000.0)

Burada execute metoduna ikinci parametre olarak bir demet (tuple) gönderiyoruz. Bu yöntem, veritabanı sürücüsünün girdileri temizlemesini ve kötü niyetli SQL komutlarının çalışmasını engellemesini sağlar.

Kritik Güvenlik Uyarısı: Kullanıcıdan alınan verileri asla string formatlama (f-string veya %) yöntemiyle SQL sorgularına doğrudan eklemeyin. Bu, veritabanınızın silinmesine veya tüm verilerin çalınmasına yol açabilecek SQL Injection açıklarına neden olur.

Stok Listeleme ve Veri Sorgulama

Eklediğimiz ürünleri görüntülemek için SELECT komutunu kullanırız. fetchall() metodu, sorgu sonucunda dönen tüm satırları bir liste olarak bize verir. Bu listeyi döngüye alarak terminalde düzenli bir şekilde gösterebiliriz.

def urunleri_listele():
    baglanti = sqlite3.connect("stoklar.db")
    imlec = baglanti.cursor()
    imlec.execute("SELECT * FROM urunler")
    veriler = imlec.fetchall()
    
    print("\n--- Mevcut Stok Listesi ---")
    for urun in veriler:
        print(f"ID: {urun[0]} | Ürün: {urun[1]} | Miktar: {urun[2]} | Fiyat: {urun[3]} TL")
    baglanti.close()

urunleri_listele()

Bu fonksiyon, veritabanındaki her bir satırı sırasıyla ekrana yazdırır. Veritabanı işlemleri bittikten sonra baglanti.close() komutu ile bağlantıyı kapatmak, bellek yönetimi açısından en iyi pratiktir.

Stok Güncelleme ve Hata Yönetimi

Stoktaki bir ürünün miktarını veya fiyatını değiştirmek için UPDATE komutunu kullanırız. Burada hangi ürünün güncelleneceğini belirlemek için ürünün id bilgisini kullanmak en sağlıklı yoldur. Ayrıca, işlem sırasında oluşabilecek hataları yakalamak için try-except bloklarını kullanmalıyız.

def stok_guncelle(urun_id, yeni_miktar):
    try:
        baglanti = sqlite3.connect("stoklar.db")
        imlec = baglanti.cursor()
        imlec.execute("UPDATE urunler SET miktar = ? WHERE id = ?", (yeni_miktar, urun_id))
        baglanti.commit()
        if imlec.rowcount == 0:
            print("Belirtilen ID ile ürün bulunamadı.")
        else:
            print("Stok başarıyla güncellendi.")
    except sqlite3.Error as e:
        print(f"Bir hata oluştu: {e}")
    finally:
        baglanti.close()

stok_guncelle(1, 15)

imlec.rowcount özelliği, yapılan sorgudan kaç satırın etkilendiğini döndürür. Eğer 0 dönüyorsa, yanlış bir ID girilmiş demektir.

Veritabanı Yöntemlerinin Karşılaştırılması

Stok takip sisteminizi ölçeklendirirken aşağıdaki yöntemlerin avantaj ve dezavantajlarını göz önünde bulundurmalısınız:

Yöntem Avantaj Dezavantaj
SQLite Hızlı kurulum, dosya tabanlı, sunucu gerektirmez. Çok kullanıcılı ve yüksek trafikli işler için kısıtlıdır.
PostgreSQL Çok yüksek performans, gelişmiş güvenlik. Kurulum ve yapılandırma maliyeti yüksektir.

Sıkça Sorulan Sorular

SQLite veritabanı dosyasını nasıl açıp görebilirim?

SQLite veritabanı dosyalarını (.db) görüntülemek için "DB Browser for SQLite" gibi ücretsiz araçları kullanabilirsiniz. Bu araçlar, verileri tablo görünümünde incelemenize ve manuel düzenleme yapmanıza olanak tanır.

Bu sistemi web tabanlı bir uygulamaya dönüştürebilir miyim?

Evet, bu mantığı Flask veya Django gibi Python web framework'leri ile birleştirerek bir web arayüzü üzerinden yönetilen bir stok takip sistemine dönüştürebilirsiniz.

Aynı anda birden fazla kişi bu veritabanına yazabilir mi?

SQLite, eşzamanlı yazma işlemlerinde kilitlenme (lock) yaşayabilir. Eğer sisteminizde aynı anda çok sayıda kullanıcı işlem yapacaksa, PostgreSQL veya MySQL gibi sunucu tabanlı veritabanlarına geçiş yapmanız önerilir.

Veritabanını nasıl yedekleyebilirim?

SQLite tek bir dosya olduğu için, stoklar.db dosyasını kopyalayıp başka bir klasöre yapıştırmanız yeterlidir. Bu, en basit ve etkili yedekleme yöntemidir.

Hata ayıklama (debug) için ne yapmalıyım?

Kodunuzda try-except bloklarını kullanarak sqlite3.Error hatalarını yakalayın. Ayrıca, her işlemden sonra print() komutları ile veritabanı durumunu konsola yazdırarak nerede hata aldığınızı kolayca görebilirsiniz.

Stok Takip Sisteminde Performans Optimizasyonu ve İndeksleme

Veritabanınızdaki ürün sayısı binlere ulaştığında, basit sorgular bile yavaşlamaya başlayabilir. SQLite, varsayılan olarak verileri tablo sırasına göre okur. İndeksleme (Indexing) kullanarak, belirli sütunlar üzerinde arama yaparken veritabanının tüm tabloyu taramasını engelleyebilir ve sorgu hızını ciddi oranda artırabilirsiniz.

Örneğin, ürün ismine göre arama yapıyorsanız, urun_adi sütunu için bir indeks oluşturmak performansı optimize edecektir:

import sqlite3

def indeks_olustur():
    baglanti = sqlite3.connect("stok_takip.db")
    imlec = baglanti.cursor()
    # Ürün adı sütununa indeks ekleyerek arama hızını artırıyoruz
    imlec.execute("CREATE INDEX IF NOT EXISTS idx_urun_adi ON urunler(urun_adi)")
    baglanti.commit()
    baglanti.close()

indeks_olustur()

İndeksler, veritabanı okuma işlemlerini hızlandırsa da, her yeni kayıt ekleme (INSERT) veya güncelleme (UPDATE) işleminde indeksin de güncellenmesi gerektiğini unutmayın. Bu nedenle, sadece sıkça sorguladığınız sütunlar için indeks oluşturmak en iyi pratiktir.

Sistemi Test Etme: Birim Testleri ile Veri Bütünlüğünü Sağlama

Geliştirdiğiniz stok takip sisteminin kararlılığını artırmak için Python'un yerleşik unittest kütüphanesini kullanabilirsiniz. Bu sayede, ürün ekleme veya stok güncelleme fonksiyonlarınızın beklenmedik durumlarda nasıl tepki verdiğini otomatik olarak kontrol edebilirsiniz.

Aşağıdaki örnek, bir ürünün veritabanına başarıyla eklenip eklenmediğini test eden temel bir yapıdır:

import unittest
import sqlite3

class TestStokSistemi(unittest.TestCase):
    def setUp(self):
        # Test için geçici bir bellek içi veritabanı oluştur
        self.baglanti = sqlite3.connect(":memory:")
        self.imlec = self.baglanti.cursor()
        self.imlec.execute("CREATE TABLE urunler (id INTEGER PRIMARY KEY, urun_adi TEXT, adet INTEGER)")

    def test_urun_ekleme(self):
        self.imlec.execute("INSERT INTO urunler (urun_adi, adet) VALUES (?, ?)", ("Test Ürünü", 10))
        self.baglanti.commit()
        
        self.imlec.execute("SELECT adet FROM urunler WHERE urun_adi=?", ("Test Ürünü",))
        sonuc = self.imlec.fetchone()
        self.assertEqual(sonuc[0], 10)

    def tearDown(self):
        self.baglanti.close()

if __name__ == '__main__':
    unittest.main()

Bu test yapısı, kodunuzda yaptığınız değişikliklerin mevcut fonksiyonları bozup bozmadığını anlamanızı sağlar. Özellikle büyük ölçekli stok sistemlerinde, bu tür test senaryoları hataları üretim ortamına (production) çıkmadan yakalamanıza yardımcı olur.

İleri Düzey İpucu: İşlemleri Gruplama (Transactions)

Eğer aynı anda onlarca ürün girişi yapıyorsanız, her execute komutundan sonra commit yapmak yerine işlemleri bir Transaction bloğuna almalısınız. Bu, disk yazma işlemlerini tek bir seferde gerçekleştirerek uygulamanızın çok daha hızlı çalışmasını sağlar.

def toplu_urun_ekle(urun_listesi):
    baglanti = sqlite3.connect("stok_takip.db")
    imlec = baglanti.cursor()
    try:
        # İşlemi başlat
        baglanti.execute("BEGIN")
        imlec.executemany("INSERT INTO urunler (urun_adi, adet) VALUES (?, ?)", urun_listesi)
        # Tümünü onayla
        baglanti.commit()
    except sqlite3.Error as e:
        baglanti.rollback()
        print(f"Hata oluştu, değişiklikler geri alındı: {e}")
    finally:
        baglanti.close()

Sonuç

Python ve SQLite kullanarak bir stok takip sistemi geliştirmek, hem veritabanı programlamanın temellerini öğrenmek hem de gerçek dünya problemlerine çözüm üretmek için harika bir yoldur. Bu rehberde öğrendiğiniz veritabanı bağlantısı, güvenli veri ekleme, sorgulama ve güncelleme teknikleri, daha karmaşık projeleriniz için temel teşkil edecektir.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Ticari veya üretim ortamında kullanılacak uygulamalarda mutlaka veri doğrulama, kullanıcı yetkilendirme ve düzenli yedekleme gibi ek güvenlik katmanları eklenmelidir.

Bir sonraki adımda, bu sisteme bir "Ürün Silme" fonksiyonu ekleyebilir veya kullanıcıların stok durumlarını grafiksel olarak görebilmesi için matplotlib kütüphanesini projeye dahil edebilirsiniz. Başarılar dilerim!

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Yaratıcı problem çözme teknikleri üzerine odaklanan bir içerik editörüyüm. Hayatı pratikleştiren tüyolarla okuyucuya zaman kazandırmayı hedefleyen yazılar kurguluyorum.

Yorumlar (0)

Yorum Yaz