SQLite veritabanına mükerrer veri ekleme kontrolü problemi

Merhabalar değerli arkadaşlar. Eğitimimde veritabanı işlemlerine ve dolayısıyla SQLite gömülü veritabanına geldim. Kendimi denemek için hazırladığım küçük çaplı programda eğer ismi ve soyadı daha evvel kayıtlı olan personelin veritabanına eklenmemesi için kontrol oluşturmak istiyorum. Ancak bir türlü başaramadım. Nerede hata yaptığım konusunda yardımcı olursanız memnun olurum.

import sqlite3

db = sqlite3.connect('C:\\Users\\ali.kasimoglu\\PycharmProjects\\denemeler\\deneme.sqlite')
cursor = db.cursor()

cursor.execute('''CREATE TABLE IF NOT EXISTS personel_listesi (
id_no INT, isim TEXT, soyisim TEXT, unvan TEXT, maas INT)''')


def personel_ekle():
    isim = input("Personelin Adı: ")
    soyisim = input("Personelin Soyadi: ")
    unvan = input("Personelin Ünvanı: ")
    maas = int(input("Maaş Tutarı: "))
    cursor.execute('''SELECT * FROM personel_listesi''')
    veri_sec = cursor.fetchall()
    id_no = 100000 + int(len(veri_sec)) + 1
    veriler = id_no, isim, soyisim, unvan, maas
    for veri in veri_sec:
        if isim != veri[1] and soyisim != veri[2]:
            cursor.execute('''INSERT INTO personel_listesi (id_no, isim, soyisim, unvan, maas) VALUES (?, ?, ?, ?, ?)''', veriler)
        elif isim == veri[1] and soyisim == veri[2]:
            print("Bu isimde kayıtlı personel mevcut!")
    db.commit()


def personelleri_goster():
    print("Sisteme Kayıtlı Personellerin Listesi:")
    cursor.execute('''SELECT * FROM personel_listesi''')
    veri_sec = cursor.fetchall()
    sayi = 1
    for i in veri_sec:
        print(f'{sayi}. ID: {i[0]}, {i[1]}, {i[2]}, {i[3]}, {i[4]}')
        sayi += 1


while True:
    print("""
    Personel Veritabanı Programına Hoşgeldiniz. Lütfen bir işlem seçiniz:
    Personel eklemek için (1)
    Personel silmek için (2)
    Personel listesini göstermek için (3)
    Programdan çıkmak için (4)
    """)
    try:
        secim = int(input("Yapmak İstediğiniz İşlemi Seçiniz: "))
        if secim == 1:
            personel_ekle()
        elif secim == 3:
            personelleri_goster()
        else:
            db.close()
            break
    except ValueError:
        print("Lütfen sadece rakam kullanınız!")

Kontrol kodunu koymadan sadece cursor.execute(’’‘INSERT INTO personel_listesi (id_no, isim, soyisim, unvan, maas) VALUES (?, ?, ?, ?, ?)’’’, veriler) kodunu kullanınca çalışıyor ama doğal olarak kontrol olmamış oluyor. SQLite veritabanı ile alakalı bir şeyleri anlamadım sanırım.

merhaba,

akşama kadar yazan olmazsa eve geçince yardım ederim :smiley:

INSERT 0 veya 1 kere calisacaksa tablodaki satir sayisi kadar calisan bir for loop’una koyulmamasi lazim.

1 Beğeni

Algoritmanızda sıkıntı var. Önce veritabanında olup olmadığını kontrol etmeniz gerekiyor. Eğer var ise fonksiyondan geri dönmeli, eğer yok ise veritabanına eklemelisiniz. İlgili fonksiyonunuz şu şekilde olmalıdır.

def personel_ekle():
    isim = input("Personelin Adı: ")
    soyisim = input("Personelin Soyadi: ")
    unvan = input("Personelin Ünvanı: ")
    maas = int(input("Maaş Tutarı: "))
    
    cursor.execute('''SELECT * FROM personel_listesi''')
    veri_sec = cursor.fetchall()
    id_no = 100000 + int(len(veri_sec)) + 1
    veriler = id_no, isim, soyisim, unvan, maas
    
    # veritabanında var olup olmadığını kontrol ediyoruz
    for veri in veri_sec:
        if isim == veri[1] and soyisim == veri[2]:
            print("Bu isimde kayıtlı personel mevcut!")
            return # var ise fonksiyondan çıkış yapıyoruz
    
    # fonksiyon buradan işlemeye devam ettiğine göre, veritabanında yoktur
    # biz de ekleme yapıyoruz bu noktada
    cursor.execute('''INSERT INTO personel_listesi (id_no, isim, soyisim, unvan, maas) VALUES (?, ?, ?, ?, ?)''', veriler)
    db.commit()
    print("Kayıt başarıyla eklendi")
1 Beğeni

Çok teşekkürler bilgi için. SQLite a odaklanmışken aslında çalışan şeyin fonksiyon olduğunu unutmuşum. Bu mantıkla da hata yapmışım. Tavsiyeniz ile veritabanını da çözeceğim. Teşekkürler.

1 Beğeni