Sqlite mutabık olma

Merhaba yazdığım programda bir kişinin aynı ad ile kayıt olmasını engellemek istiyorum bunu nasıl yapabilirim sqlite veritabanı sorunsuz çalışıyor. Kayıt olma kısmında sorun yok ama veri boyutunun büyümemesi için tekrarlı kayıtları engellemem gerekiyor varsa bildiğiniz bir link eğer yoksa bana kısaca anlatabilirmisiniz?

Ayni ad ile kayit olmayi engellemek icin sql unique ozelligini arastirabilirsiniz.

Kayıt işlemi sonlandırılırken if ve else ile isimlerin aynı olup olmadığını kontrol ettirebilirsiniz.

Yanlış anladınız sanırım yada ben yanlış anladım ben kayıt sonrası uygulama işi bittikten sonradan bahsediyorum. yani uygulamayı kullanmayı bitirdim ve tekrar kullanmaya başladım bu sırada nasıl if elif else komutu kullanabilirimki?

Kayıt sonrasında oluşacak veritabanına bakarsanız aynı isimlerin olacağını görebilirsiniz.Bunu kayıt olma esnasında kontrol etmeniz gerekiyor.“Kaydı tamamla” butonu kayıt işlemini gerçekleştirmeden önce if komutunu kullanarak aynı isimden olup olmadığını kontrol etmeli.Ya da ben tamamen yanlış anladım.

Uygulamaya zaten kayıt oldunuz ilk çalıştırmada.İkinci çalıştırmada ise giriş yapıyorsunuz,kayıt değil.Yoksa ben mi yanlış biliyorum :thinking:

Hayır elbette doğru biliyorsunuz benim anlatımım biraz hatalı olmuş bu uygulama birden fazla kişi kullanacak onun için 2. seferde de birinin kayıt olduğunu varsayarak söyledim evet if elif kullanılabilir ama nasıl kısa bir örnek verebilirmisiniz?

Bu bütün veritabanını taramayı gerektirdiğinden tutarsız bir yöntem. Sqlite unique field’e aynı değer girilmeye çalışılırsa hata verecek, try catch ile kayıt tekrarı önlenebilir.

Siz kendinizi yormayın, bırakın bu işi usulüne uygun şekilde veritabanı yönetim sisteminiz yapsın.
Bir data nın “benzersiz” (unique) olmasını istediğinizi belirtirseniz,

Ben bu yüzden emin olamadım. Sonuçta benim programım belkide 20 kişilik falan bir uygulama olacak ancak 1000’lerce kişilik programlarda sorun yaratır diye düşündüğüm için başka bir yol arayışına girdim

Anladığım kadarıyla bunu benim veritabanının arayüzünden yapmam gerek peki nasıl yapılacak?Ben DBbrowser kullanıyorum

Sanırım anlıyorum arayüz üzerinden index şeması düzenleme kısmında araştırırken karşılaştığım kodların aynısı var. Benzersiz seçeneği falan ama tam olarak çözemedim maalesef

Çok fazla cevap attım size kusura bakmayın çözdüm sanırım şuanlık sadece terminale geliyor ama ayarları yapıp kullanıcıya hber vermesini sağlarım sanırım çok teşekkürler sorunum çözüldü

Veritabanı arayüzü sadece debug amaçlı, hiçbir şey için ona bağımlı değilsiniz.

Burada söyleneni nasıl yapacağınız anlatılıyor:

Her ne kadar doğru yöntem unique kullanmak olsa da onun implementasyonun da çok farklı olduğunu sanmıyorum. O field’deki hiçbir değerin girilmeye çalışılan değer ile aynı olmadığından emin olunması lazım, dict veya set gibi bir veri yapısı kullanacaksak da bunların hafızada önceden hazırlanmış ve bekletiliyor olması gerekiyor.

1 Beğeni

Arayüz ile uğraşmayın, tabloyu oluştururken mesela kullanici_adi isminde bir sütun oluşturup value type’ını da TEXT olarak belirttiniz:

CREATE TABLE users (username TEXT)

Burada yapmanız gereken tek şey, TEXT kelimesinin sağına UNIQUE yazmak.

Katılıyorum.

Field’ı Unique olarak tanımlamak yeterli değil mi? Ekstra bir süzgeç oluşturup hem veritabanından hem de bu süzgeçten onay aldıktan sonra mı işlem yapılmalı?

Yeterli, ben sqlite’ın ne yapıyor olabileceği hakkında konuşuyordum.

1 Beğeni

Pardon, Unique’dan konuşuyorduk, siz “emin olunması lazım” deyince ben farklı anladım sanırım :slight_smile:

1 Beğeni

Veritabanı alfabetik sıraya göre yapılırsa Ahmet ismine sahip bir kişiyi rahatça arayabilir.

Aynı zamanda araya değer eklerken bir sürü veriyi kaydırmayı gerektirir, rowid’ler sıralı olmayacağı için id ile row bulmak log2(n) time complexity’e sahip olmaz…

SQLite’ın bunu desteklediğini bile sanmıyorum.

Çözüme ulaştım artık veritabanına birden fazla kez kayıt oluşmuyor ancak Hata Yakalama belgesini tekrardan okumama rağmen hata mesajı kullanıcıya iletilmiyor yazdığım kod şöyle;

def kayıt_ol():
try:
    def isimüreteci():
        yazımız = tk.Label(form3, text=random.choice(randomisim)).pack()
    form3 = tk.Tk()
    form3.title("Kayıt Ol")
    form3.geometry("500x400+450+200")
    versiyon = tk.Label(form3, text=version)
    versiyon.place(x=472, y=375)
    tk.Label(form3, text="Evvvvetttttt,sonunda bir arkadaş kayıt oluyorrr").pack()
    tk.Label(form3, text="İsim-nick seçebilirsin").pack()
    global isim
    isim = tk.Entry(form3)
    isim.pack()
    randomisimseç=tk.Button(form3,text="Rastegele isim üretmek için tıklayınız....",command=isimüreteci).pack()
    tk.Label(form3, text="Şimdide şifre lütfen:").pack()
    global şifre
    şifre = tk.Entry(form3)
    şifre.pack()
    tk.Button(form3, text="Bu Benim!!", command=veriatabanınakayıt).pack()
except sqlite3.IntegrityError:
    print("hata")

aldığım hata ise şöyle;

 sqlite3.IntegrityError: UNIQUE constraint failed: kullanıcılar.isim

Normal şartlarda benim yaptığım doğru değilmi? Ben mi birşeyi yanlış anladım acaba?