Python Sql'den veri çekme

Arkadaşlar selam,

Sql tablosundan gelen verileri int olarak alamıyorum. Kod şu şekilde:

def check_db():
cs.execute(“SELECT hour_choice FROM Reminders WHERE year_choice >= 2021 AND month_choice >= 5 AND day_choice >= 29”)
data = cs.fetchall()
list_data = []
list_data.append(data)
for i in list_data:
print(i)

Çıktı : [(20,), (20,), (20,), (20,), (20,), (20,), (21,)]

Diyelim ki bu verileri toplamak isteyeyim(sum kullanmadan for dögüsüyle). Şu hatayı verdi.
TypeError:unsupported operand type(s) for +=: ‘int’ and ‘list’

Parantez içi virgüllere de bir anlam veremedim. Var mı yardımcı olabilecek bir yiğit ? :smiley:

Pythonda Tuple’ı oluşturan virgüldür. (Tuple depolama için kullanılan, elemanları değiştirilemeyen koleksiyondur.) Tuple tanimlamak için tup = 5, yazılmalıdır. Bu tup değişkenini tek elemanlı değiştirilemez bir tuple’a dönüştürür.

Çıktın tuple’lardan oluşuyor ve sen bunları listeye ekliyorsun.

toplam = 0
for i in list_data:
    toplam = toplam + i[0]

Listedeki tuple değerler arasında dolaşarak içerisinde bulunan tuple değerlerin ilk değeri sayıyı verdiği için bunları for ile toplayan programı yukarıya bıraktım.

Buradaki hata ise integer bir değer ile liste değeri toplayamayacağını söyluyor. Toplama işlemi yapmadan önce toplamada kullanacağın değişkenlerin tipini type(değişken) ile kontrol etmeni öneririm.

Hocam öncelikle değerli cevabınız için teşekkür ederim. Tuple olayını genel ölçüde anladım. Sanırsam veri tabanından değerleri tuple olarak alabiliyorum. Diğer türlüsü olmuyor.

Verdiğiniz kodu entegre ettim ancak yine hata aldım :
TypeError: unsupported operand type(s) for +: ‘int’ and ‘tuple’
Bu sefer de tuple hatası alıyorum.

Aslında bu programı ben denemek için kullanıyorum. PC her açıldığında daha önceden kaydedilmiş bir alarmı(Tarih saat dakika ve saniye olarak) veri tabanından kontrol etmek istiyorum. Diyelim ki 2 gün sonrasına bir alarm kurdum notunu da kaydettim. 2 gün sonra pc açıldığında saati gelecek ve alarm notuyla beraber çalacak.
Veri tabanından int olarak kullanıcı tarafından kaydedilen tarih saat dakika ve saniye bilgisini int olarak çekebilirsem if döngüsüyle bir karşılaştırma yapabilirim. Ya da direkt olarak bir karşılaştırma yapabilir miyim bilmiyorum.

Şundan yola çıkarak aşağıdaki kodların sağına yazdığım sonuçları döndüreceğini tahmin etmiştim ama öyle değilmiş.

print(list_data)  # [(20,), (20,), (20,), (20,), (20,), (20,), (21,)]
print(list_data[0])  # (20,)
print(type(list_data[0]))  # tuple
print(list_data[0][0])  # 20
print(type(list_data[0][0]))  # integer 

Kodları bir de sen çalıştırıp çıktıyı atar mısın acaba? Sorunun basit görünüyor çözebiliriz.

Datetime modülünü incelemeni öneririm, işini kolaylaştırabilir. Modulu kullanmadan kullanıcıdan saat.dakika.saniye şeklinde (20.10.40) giriş yapmasını sağlarsan split methodu parçalara ayırıp kolayca kontrolu sağlayabilirsin.

Değerleri doğru şekilde alabilirsek elbette karşılaştırma yapabilirsin. Ama yapmaya çalıştığın program için neden saat değelerini topladığını pek anlamadım. Saat değerleri veri tabanında nasıl kayıtlı ve sen nasıl bir yol izliyorsun?

Bu kodlara göre çıktı şu şekilde :
[[(20,), (20,), (20,), (20,), (20,), (20,), (21,)]]
[(20,), (20,), (20,), (20,), (20,), (20,), (21,)]
<class ‘list’>
(20,)
<class ‘tuple’>
Yani çıktı ya tuple ya da list olarak dönüyor.

Programda pc anlık olarak açıkken 10 dakika sonraya veya 2 saate sonra kurduğum alarmı çaldırabiliyorum. Ancak pc kapanırsa ya da uyku moduna alınırsa haliyle hata alıyorum. Datetime modülünü programa entegre ettim. Ancak veri tabanı kullanmazsam 2 gün sonraya veya 1 hafta sonraya planlanan alarmı çalıştıramıyorum. Bu yüzden veri tabanına yöneldim.
Bir de kullanıcıdan tkinter Option Menu ile saat dakika bilgisini ayrı ayrı alabiliyorum. Orda da sıkıntı yok.

İnşallah baya uğraştırdı ama umuyorum olacak :smiley:

Hocam biraz araştırdım ve iyi bir sonuç aldım diyebilirim. Elimdeki tuple veriyi int’e çevirmeye odaklandım ve oldu. Kodlar şu şekilde :

print(list_data)  # [(20,), (20,), (20,), (20,), (20,), (20,), (21,)]
list_data_real1 = list_data[0][0]
list_data_int1 = int(''.join(map(str, list_data_real1)))
print(list_data_int1)
print(type(list_data_int1))

Her biri için ayrı ayrı indexleyerek int veri elde ettim.

Çıktısı da şu şekilde oldu :
[[(20,), (20,), (20,), (20,), (20,), (20,), (21,)]]
20
<class ‘int’>
20
<class ‘int’>
20
<class ‘int’>
20
<class ‘int’>
20
<class ‘int’>
20
<class ‘int’>
21
<class ‘int’>
Join ve map kullanarak sizin de yardımınızla çözdüm olayı. Biraz fazladan kod yazmam gerekecek ama olsun. Her bir veri için ayrı ayrı tanımlama yaparak ilerleyebilirim(Keşke for döngüsüyle olsaydı :thinking:) Teşekkür ediyorum sağolun :smiley:

Oluyor tabiki.

list_data değişkeninin bu şekilde olduğunu öngermeliydim.

Burada list_data içerisinde dolaşıp ekrana yazdırdığını kaçırmışım, direkt olarak çıktının list_data olduğunu sanmışım.

İlk yazdığım döngüde toplama i[0] değeri değil de i[0][0] değeri eklenirse çalışacaktır. Yani hemen yukardaki güncellenmiş for döngüsü bu kez çalışacak.

Hocam merhaba, kod bu şekilde çalıştı. Daha önce list_data’nın indexini almıştık. Şimdi anladım. Bu daha iyi oldu.
Peki list_data içerisindeki tüm elemanları for döngüsüyle alabilir miyiz ? Yoksa hepsine tek tek for döngüsü kurmam mı gerekiyor ?

Liste içerisinde her tuple’da tek değer kullanıldığı için her birinin ilk değerini topladık.

Yani list_data içerisinde olan her integer değeri toplamış olduk zaten.

Sanıyorum ki senin sorun [[(20, 20, 20), (20, 20, 20), (20, 21, 21), (20, 22, 23)]] ‘şöyle bir liste elimizde olsa ve bu listedeki tüm elemanları toplamak için ne yapabiliriz’ yönünde.
Bunun için de döngü içinde döngü kullanarak toplama işlemi yapılabilir.
Örneğin list_data içeriğini şu şekilde alırsak [(20, 20, 20), (20, 20, 20), (20, 21, 21), (20, 22, 23)];

sonuc = 0
for i in list_data:
    for j in i:
        sonuc = sonuc + j

list_data içersinde döner. İlk dönüşte i (20, 20, 20) değerini alır. Sonraki adımda ise i içersinde döner ve i içersinde tutulan değerler toplanır. Tüm dönüşlerin sonunda ise listedeki tüm elemanların toplamına ulaşır.
Aynı mantıkla ‘liste içinde liste içinde liste’ olursa da 3 içiçe döngü ile tüm değerleri toplayabilirsin.

Hocam tam anlatamadım galiba. Şöyle ki list_data içindeki her elemanı ayrı ayrı almayı düşünüyorum.
list_data = [[(20,), (20,), (20,), (20,), (20,), (20,), (21,)]]

toplam = 0
for i in list_data:
toplam = toplam + i[0][0]
Bu döngüyle ilk indeksi alabiliyoruz burada sıkıntı yok. Mesela son “(21,)” elemanını int olarak almak için de şu kod çalışıyor :
toplam = 0
for i in list_data:
toplam = toplam + i[6][0]
print(toplam)
print(type(toplam))
Burada çıktı şöyle oluyor :
21
<class ‘int’>
Ben bunu her eleman için ayrı ayrı 7 farklı for döngüsü kurarak yapabilirim. ama iç içe bir döngü kullanarak veya bunu while ile 7 kez deneyerek yapabilirim diye düşünüyorum.

Tamamdır iç içe for döngüsünü de hallettim :
def check_db():
cs.execute(“SELECT hour_choice FROM Reminders WHERE year_choice >= 2021 AND month_choice >= 5 AND day_choice >= 29”)
data = cs.fetchall()
list_data = []
list_data.append(data)
print(list_data)
toplam = 0
for j in range(len(data)):
for i in list_data:
toplam = 0
toplam = toplam + i[j][0]
print(toplam)
print(type(toplam))

check_db()
condb.close()
Çıktı :
[[(20,), (20,), (20,), (20,), (20,), (20,), (21,)]]
20
<class ‘int’>
20
<class ‘int’>
20
<class ‘int’>
20
<class ‘int’>
20
<class ‘int’>
20
<class ‘int’>
21
<class ‘int’>
Değerli yardımınız için teşekkür ederim sağolun :smiley:

Rica ederim, iyi çalışmalar.

1 Beğeni