Bu bir örnek kod bloğudur. Aşağıda belirttiğim durum ya da türevlerinde bir ihtiyacınız var ise kendi kodlarına göre uyarlayarak, uygulayabilirsiniz.
Kullanılacak modüller;
sqlite
itertoools
Hangi durumlarda ihtiyacınız olacak?
Kullanıcıdan 1 den fazla veri alıp veri tabanında sorgulamalar yapacağınız zaman.
Kullanıcıdan aldığınız verileri birbirinden bağımsız ve benzersiz şekilde oluşturup veri tabanında sorgulamalar yapacağınız zaman.
Örneğin 10 sütundan oluşan bir sqlite tablonuz var ve sizler kullanıcıdan 5 farklı veri alıyorsunuz. Bu 5 veri, veri tabanındaki 5 sütuna karşılık geliyor. Fakat kullanıcı bu 5 farklı veriyi her zaman girmek zorunda olmayabilir. Örneği veri tabanında kayıtlı olan 2 sütundaki verilere göre arama yapmak istiyor olabilir ya da 4 tane.
Bu tarz durumlarda kullanıcıdan alınan verileri kontrol ederek uygun olan koşulda veri tabanında sorgu yapıp verileri çekmemiz lazım. Fakat bu şekilde uygularsak 4-5 den fazla farklı veri girişi yapılacağı zaman çok fazla if-elif bloğu oluşturmanız gerekecek. İşte bunu kısa yoldan çözen o algoritmayı paylaşıyorum sizlerle;
import itertools
# Kullanıcıdan alınan veriler (örnek) bu noktada hangi veririn hangi sütuna ait olduğunu anlıyoruz ve kullanıcıdan alınan verileri değişkenlere atıyoruz (tkinter modülü kullanılmaktadır)
z1 = y1.get() # FIRMA_ADI
z2 = y2.get() # BEYANNAME
z3 = y3.get() # DONEM
z4 = y4.get() # YIL
z5 = y5.get() # DURUM
# Veritabanı sütunları - burada ise giriş yapılan verilerin hangi sütunlara karşılık oluşturulacağını belirtiyoruz ki benzersiz ve eşsiz sorgu yapabilmenin ilk adımı atılsın
columns = {
'z1': 'FIRMA_ADI',
'z2': 'BEYANNAME',
'z3': 'DONEM',
'z4': 'YIL',
'z5': 'DURUM'
}
# Kullanıcının girdiği değişkenleri bir listeye yerleştirelim
inputs = {
'z1': z1,
'z2': z2,
'z3': z3,
'z4': z4,
'z5': z5
}
# Verileri içeren kombinasyonları oluşturuyoruz
for i in range(1, 6): # 1'den 5'e kadar kombinasyonlar
for comb in itertools.combinations([key for key, value in inputs.items() if value], i):
# Kombinasyonu yazdırıyoruz
query_columns = [columns[key] for key in comb]
query_values = [inputs[key] for key in comb]
# SQL sorgusunu oluşturuyoruz
query = f"SELECT FIRMA_ADI, BEYANNAME, DONEM, YIL, BILANCO_TUTAR, BRUT_SATIS, DURUM, SORUMLU, KAYIT_EDEN, KAYIT_ID FROM KAR_ZARAR_BILGILERI WHERE " + " AND ".join([f"{col} = ?" for col in query_columns]) + " ORDER BY DONEM ASC"
# Sorguyu çalıştırıyoruz
cur.execute(query, tuple(query_values))
bu şekilde veritabanına göndereceğiniz sorguyu otomatik olarak oluşturmuş ve benzersiz tasarlamış oluyorsunuz
for i in range(1,6)
>> bu kısımda kullanıcıdan aldığınız veri sayısına göre değişiklik yapabilirsiniz. Kombinasyonlar buna göre oluşacaktır. Alternatif olarak aynı satır için for i in range(5)
kullanmanız da 5 farklı kombinasyonu uygulayacaktır.
Üstteki kodda yer alan bilgiler kendi programımdan alındığı için veri tabanı adı ve sütun isimleri sizler tarafından değiştirilmesi gereken yerlerdir.
-ORRDER BY DONEM ASC-
sql sorgusu içerisinde yer alan bu kısım çekilen verilerin DONEM sutnundaki küçükten büyüğe sıralaması ile oluşur. Buraya yazacağınız kendi SUTUN adınız sıralama durumunu değiştirecektir. Bu kısmı silebilirsiniz. Opsiyoneldir.
KAZANIMLAR
5 farklı veri alarak benzersiz ve eşsiz sorgulamalar için 32 farklı koşul bloğu ve her biri için sorgu satırı oluşturmak yerine tek algoritmada bu durumu çözmüş olduk. Bu sayının artması verimsiz kod yapılarının oluşmasına yol açacaktır.
Hedefiniz daima en az kod ile en yüksek süreçleri yapabilmek olsun.
Umarım ihtiyacınızı karşılar, aksi durumlarda sorularınızı yanıtlamaktan mutluluk duyarım.