Python sqlite veri ekleme

Pythonda Banka adında bir uygulama geliştiriyorum. Amacım normal OOP kullanmak. Ama şöyle bir farklılıkla, şifre_koy, şifre_yenile, para_çek vb. işlemler normal olarak sqlite3 kullanılmadan yapılacak. Ancak havale isimli bir fonksiyon da tanımladım. İşte bu havale fonksiyonu bir sqlite Veritabanı oluşturacak ve bu yöntemle kullanıcının girdiği para miktarı database e insert edilecek. Tabi öncesinden def baglanti_olustur adında bir fonksiyonla sqlite veritabanını oluşturdum. Şimdi sorum şu: Bütün fonksiyonlar sqilte işlemlerine dahil mi edilmeli yoksa aralarından bazı fonksiyonları spesifik olarak dahil edebilir miyim? Anlaşılmıştır umarım. Koddan bir parça.: Bu kast ettiğim şeyi nasıl yapabilirim. Tarif ederseniz sevinirim. Kodda yanlışlıklar olabilir zaten gözden geçiricem. Siz ne demek istediğimi anlayınn diye paylaştım


    def __init__(self):
        self.bağantı_oluştur()

    def bağantı_oluştur(self):
        self.bağlantı = sqlite3.connect("Banka.db")
        self.cursor = self.bağlantı.cursor()
        sorgu = "Create Table If Not Exists Banka (isim TEXT, bakiye INT, şifre INT, kart_no INT, kart_limiti INT, kart_bakiyesi INT, havale INT)"
        self.cursor.execute(sorgu)
        self.bağlantı.commit()

    def bağlantı_kes(self):
        self.bağlantı.close()

    def şifre_koy(self, koy_şifre):
        print("Merhaba... Bankamıza Hoşgeldiniz... Şifre Koyarak giriş yapabilirsiniz...")
        while True:
            self.şifre = int(input("Şifrenizi giriniz: "))
            if self.şifre == koy_şifre:
                print("Şifre doğru...")
                time.sleep(2)
                break
            else:
                print("Şifre yanlış...")
                time.sleep(2)
                continue


    def şifre_yenile(self, yeni_şifre):
        while True:
            karar = input("Şifrenizi değiştirmek istiyor musunuz? (E/H): ")
            if karar == "E":
                self.şifre = yeni_şifre
                print("Şifreniz başarıyla değiştirildi.")
                time.sleep(2)
                break
            elif karar == "H":
                print("Şifreniz değiştirilmedi.")
                time.sleep(2)
                break

    def şifre_sorgula(self):
        print("Şifreniz: ", self.şifre)

    def hesaba_para_yatır(self,miktar):
        self.bakiye += int(miktar)
        print("Para başarıyla yatırıldı.")`Önceden biçimlendirilmiş yazı`
kodu buraya gir veya yapıştır

Soruyu karma karışık yazmışsın, biraz daha açıklayıcı ve sistematik yazmanı tavsiye ediyorum. Tam olarak ne yapamak istediğin anlaşılmıyor.

Bir fonksiyonu SQLite islemlerine dahil etmek nedir?
Ornek kodda hangi fonksiyonlar SQLite islemlerine dahil, hangileri degil mesela?

import time
import sqlite3


class Banka:

    def __init__(self, isim, bakiye, şifre, kart_no, kart_limiti, kart_bakiyesi, havale):
        self.isim = isim
        self.bakiye = bakiye
        self.şifre = şifre
        self.kart_no = kart_no
        self.kart_limiti = kart_limiti
        self.kart_bakiyesi = kart_bakiyesi
        self.havale = havale

    def __str__(self):
        return "İsim: {}\nBakiye: {}\nŞifre: {}\nKart No: {}\nKart Limiti: {}\nKart Bakiyesi: {}\nHavale: {}\n".format(self.isim, self.bakiye, self.şifre, self.kart_no, self.kart_limiti, self.kart_bakiyesi, self.havale)



class ATM(Banka):

    def __init__(self):
        self.bağantı_oluştur()

    def bağantı_oluştur(self):
        self.bağlantı = sqlite3.connect("Banka.db")
        self.cursor = self.bağlantı.cursor()
        sorgu = "Create Table If Not Exists Banka (isim TEXT, bakiye INT, şifre INT, kart_no INT, kart_limiti INT, kart_bakiyesi INT, havale INT)"
        self.cursor.execute(sorgu)
        self.bağlantı.commit()

    def bağlantı_kes(self):
        self.bağlantı.close()

    def şifre_koy(self, koy_şifre):
        print("Merhaba... Bankamıza Hoşgeldiniz... Şifre Koyarak giriş yapabilirsiniz...")
        while True:
            self.şifre = int(input("Şifrenizi giriniz: "))
            if self.şifre == koy_şifre:
                print("Şifre doğru...")
                time.sleep(2)
                break
            else:
                print("Şifre yanlış...")
                time.sleep(2)
                continue


    def şifre_yenile(self, yeni_şifre):
        while True:
            karar = input("Şifrenizi değiştirmek istiyor musunuz? (E/H): ")
            if karar == "E":
                self.şifre = yeni_şifre
                print("Şifreniz başarıyla değiştirildi.")
                time.sleep(2)
                break
            elif karar == "H":
                print("Şifreniz değiştirilmedi.")
                time.sleep(2)
                break

    def şifre_sorgula(self):
        print("Şifreniz: ", self.şifre)

    def hesaba_para_yatır(self,miktar):
        self.bakiye += int(miktar)
        print("Para başarıyla yatırıldı.")
        

    def para_çek(self,çekilecek_para):
        if çekilecek_para > self.bakiye:
            print("Bakiyeniz yetersiz.")
        else:
            self.bakiye -= çekilecek_para
            print("Para başarıyla çekildi.")
            print("Bakiyeniz: ", self.bakiye)

    def bakiye_sorgula(self):
        print("Bakiyeniz: ", self.bakiye)

    def kredi_mevduatı_oluştur(self):  # Kredi oluşturmak için ipotek istesin.
        print("DİKKAT!! Kart limitiniz 5000 TL dir. Ona göre borç alınız...")
        time.sleep(2)
        self.kart_no = int(input("Kart numaranızı giriniz: "))
        self.kart_limiti = int(input("Kart limitinizi giriniz: "))
        borç = int(input("Alacağınız Borç miktarınızı giriniz: "))
        if borç > self.kart_limiti:
            print("Kart limitiniz yetersiz.")
        else:
            self.bakiye += borç
            print("Kredi başarıyla oluşturuldu.")
            time.sleep(2)
            print("Kart limitiniz: ", self.kart_limiti)
            print("Kart bakiyeniz: ", self.bakiye)
            print("Kart numaranız: ", self.kart_no)

    def kredi_borcu_öde(
            self):  # Girilen tutar eğer ödenmesi gereken kredi borcundan az ise, eksik kısmı borçlara kaydetsin ve bakiyeyi azaltıp borcu sıfırlasın.
        borç = int(input("Ödeme yapmak istediğiniz tutarı giriniz:"))
        if borç > self.bakiye:
            print("Bakiyeniz yetersiz.")
        else:
            self.bakiye -= borç
            print("Kredi borcunuz başarıyla ödendi....")

    def fatura_öde(
            self):  # Eğer bakiye eksiye düşerse fatura ödeme işlemi yapsın ve bakiye eksiye düşsün. Bakiyedeki eksi miktar kadar borçlansın
        print("Su faturası 100 TL dir.")
        time.sleep(2)
        print("Elektrik faturası 200 TL dir.")
        time.sleep(2)
        print("Su faturası için 1'i, Elektrik faturası için 2'yi tuşlayınız.")
        time.sleep(1)
        fatura = int(input("Fatura numarasını giriniz: "))
        if fatura == 1:
            if self.bakiye < 100:
                print("Bakiyeniz yetersiz.")
            else:
                self.bakiye -= 100
                print("Su faturası başarıyla ödendi.")
                time.sleep(2)
                print("Kalan bakiyeniz: ", self.bakiye)
        elif fatura == 2:
            if self.bakiye < 200:
                print("Bakiyeniz yetersiz.")
            else:
                self.bakiye -= 200
                print("Elektrik faturası başarıyla ödendi.")
                time.sleep(2)
                print("Kalan bakiyeniz: ", self.bakiye)

    def çıkış(self):
        print("Kartınız iade ediliyor...")
        time.sleep(2)
        print("Kartınız iade edildi.")
        time.sleep(1)
        print("İyi günler dileriz.")
        time.sleep(2)
        quit()

    def havale(self,para):
        sorgu = "INSERT INTO havale (havale_miktarı) VALUES (?)"
        self.bağlantı.execute(sorgu, (para,))
        self.bağlantı.commit()

banka = Banka()

print("*****************", "Bankamıza Hoşgeldiniz", "*****************")
      
print("1-Şifre Koy","2-Şifre yenile","3-Şifre Sorgula","4-Hesaba para yatır","5-Para çek","6-Bakiye Sorgula "
      ,"7-Kredi Mevduatı Oluştur","8-Kredi Borcu Öde","9-Fatura Öde","10-Çıkış",sep="\n")

while True:
    işlem = int(input("Yapmak istediğiniz işlemi seçiniz: "))
    if işlem == 1:
        banka.şifre_koy()
    elif işlem == 2:
        yeni_şifre = input("Yeni şifrenizi giriniz: ")
        banka.şifre_yenile(yeni_şifre)
    elif işlem == 3:
        banka.şifre_sorgula()
    elif işlem == 4:
        miktar = int(input("Yatırmak istediğiniz tutarı giriniz: "))
        banka.hesaba_para_yatır(miktar)
    elif işlem == 5:
        çekilecek_para = int(input("Çekmek istediğiniz tutarı giriniz: "))
        banka.para_çek(çekilecek_para)
    elif işlem == 6:
        banka.bakiye_sorgula()
    elif işlem == 7:
        banka.kredi_mevduatı_oluştur()
    elif işlem == 8:
        banka.kredi_borcu_öde()
    elif işlem == 9:
        banka.fatura_öde()
    elif işlem == 10:
        banka.çıkış()
    else:
        print("Hatalı işlem...")
        time.sleep(2)
        continue

Demek istediğim, def baglanti_oluştur fonksiyonunda sqlite işlemi yapmışım değil mi? Normalde diğer alttaki tanımlanmış (mesela def şifre_koy) fonksiyonlarda da sqlite işlemi uygulamam lazım. Yani cursor.execute gibi işlemler. Burayı anladığınızı zannediyorum. Mesele şu, sqlite i tüm fonksiyonlarda kullanmalı mıyım? Farkındaysanız def (baglantı_oluştur, baglantı_kes ve havale) adlı fonksiyonlarda sqlite kullanmışım. Bu normal mi? Olabilir mi? Üstelik kod çalışmadı. Nerde mantık hatası yaptım söylerseniz sevinirim…

import time
import sqlite3


class Banka:

    def __init__(self, isim, bakiye, şifre, kart_no, kart_limiti, kart_bakiyesi, havale):
        self.isim = isim
        self.bakiye = bakiye
        self.şifre = şifre
        self.kart_no = kart_no
        self.kart_limiti = kart_limiti
        self.kart_bakiyesi = kart_bakiyesi
        self.havale = havale

    def __str__(self):
        return "İsim: {}\nBakiye: {}\nŞifre: {}\nKart No: {}\nKart Limiti: {}\nKart Bakiyesi: {}\nHavale: {}\n".format(self.isim, self.bakiye, self.şifre, self.kart_no, self.kart_limiti, self.kart_bakiyesi, self.havale)



class ATM(Banka):

    def __init__(self):
        self.bağantı_oluştur()

    def bağantı_oluştur(self):
        self.bağlantı = sqlite3.connect("Banka.db")
        self.cursor = self.bağlantı.cursor()
        sorgu = "Create Table If Not Exists Banka (isim TEXT, bakiye INT, şifre INT, kart_no INT, kart_limiti INT, kart_bakiyesi INT, havale INT)"
        self.cursor.execute(sorgu)
        self.bağlantı.commit()

    def bağlantı_kes(self):
        self.bağlantı.close()

    def şifre_koy(self, koy_şifre):
        print("Merhaba... Bankamıza Hoşgeldiniz... Şifre Koyarak giriş yapabilirsiniz...")
        while True:
            self.şifre = int(input("Şifrenizi giriniz: "))
            if self.şifre == koy_şifre:
                print("Şifre doğru...")
                time.sleep(2)
                break
            else:
                print("Şifre yanlış...")
                time.sleep(2)
                continue


    def şifre_yenile(self, yeni_şifre):
        while True:
            karar = input("Şifrenizi değiştirmek istiyor musunuz? (E/H): ")
            if karar == "E":
                self.şifre = yeni_şifre
                print("Şifreniz başarıyla değiştirildi.")
                time.sleep(2)
                break
            elif karar == "H":
                print("Şifreniz değiştirilmedi.")
                time.sleep(2)
                break

    def şifre_sorgula(self):
        print("Şifreniz: ", self.şifre)

    def hesaba_para_yatır(self,miktar):
        self.bakiye += int(miktar)
        print("Para başarıyla yatırıldı.")
        

    def para_çek(self,çekilecek_para):
        if çekilecek_para > self.bakiye:
            print("Bakiyeniz yetersiz.")
        else:
            self.bakiye -= çekilecek_para
            print("Para başarıyla çekildi.")
            print("Bakiyeniz: ", self.bakiye)

    def bakiye_sorgula(self):
        print("Bakiyeniz: ", self.bakiye)

    def kredi_mevduatı_oluştur(self):  # Kredi oluşturmak için ipotek istesin.
        print("DİKKAT!! Kart limitiniz 5000 TL dir. Ona göre borç alınız...")
        time.sleep(2)
        self.kart_no = int(input("Kart numaranızı giriniz: "))
        self.kart_limiti = int(input("Kart limitinizi giriniz: "))
        borç = int(input("Alacağınız Borç miktarınızı giriniz: "))
        if borç > self.kart_limiti:
            print("Kart limitiniz yetersiz.")
        else:
            self.bakiye += borç
            print("Kredi başarıyla oluşturuldu.")
            time.sleep(2)
            print("Kart limitiniz: ", self.kart_limiti)
            print("Kart bakiyeniz: ", self.bakiye)
            print("Kart numaranız: ", self.kart_no)

    def kredi_borcu_öde(
            self):  # Girilen tutar eğer ödenmesi gereken kredi borcundan az ise, eksik kısmı borçlara kaydetsin ve bakiyeyi azaltıp borcu sıfırlasın.
        borç = int(input("Ödeme yapmak istediğiniz tutarı giriniz:"))
        if borç > self.bakiye:
            print("Bakiyeniz yetersiz.")
        else:
            self.bakiye -= borç
            print("Kredi borcunuz başarıyla ödendi....")

    def fatura_öde(
            self):  # Eğer bakiye eksiye düşerse fatura ödeme işlemi yapsın ve bakiye eksiye düşsün. Bakiyedeki eksi miktar kadar borçlansın
        print("Su faturası 100 TL dir.")
        time.sleep(2)
        print("Elektrik faturası 200 TL dir.")
        time.sleep(2)
        print("Su faturası için 1'i, Elektrik faturası için 2'yi tuşlayınız.")
        time.sleep(1)
        fatura = int(input("Fatura numarasını giriniz: "))
        if fatura == 1:
            if self.bakiye < 100:
                print("Bakiyeniz yetersiz.")
            else:
                self.bakiye -= 100
                print("Su faturası başarıyla ödendi.")
                time.sleep(2)
                print("Kalan bakiyeniz: ", self.bakiye)
        elif fatura == 2:
            if self.bakiye < 200:
                print("Bakiyeniz yetersiz.")
            else:
                self.bakiye -= 200
                print("Elektrik faturası başarıyla ödendi.")
                time.sleep(2)
                print("Kalan bakiyeniz: ", self.bakiye)

    def çıkış(self):
        print("Kartınız iade ediliyor...")
        time.sleep(2)
        print("Kartınız iade edildi.")
        time.sleep(1)
        print("İyi günler dileriz.")
        time.sleep(2)
        quit()

    def havale(self,para):
        sorgu = "INSERT INTO havale (havale_miktarı) VALUES (?)"
        self.bağlantı.execute(sorgu, (para,))
        self.bağlantı.commit()

banka = Banka()

print("*****************", "Bankamıza Hoşgeldiniz", "*****************")
      
print("1-Şifre Koy","2-Şifre yenile","3-Şifre Sorgula","4-Hesaba para yatır","5-Para çek","6-Bakiye Sorgula "
      ,"7-Kredi Mevduatı Oluştur","8-Kredi Borcu Öde","9-Fatura Öde","10-Çıkış",sep="\n")

while True:
    işlem = int(input("Yapmak istediğiniz işlemi seçiniz: "))
    if işlem == 1:
        banka.şifre_koy()
    elif işlem == 2:
        yeni_şifre = input("Yeni şifrenizi giriniz: ")
        banka.şifre_yenile(yeni_şifre)
    elif işlem == 3:
        banka.şifre_sorgula()
    elif işlem == 4:
        miktar = int(input("Yatırmak istediğiniz tutarı giriniz: "))
        banka.hesaba_para_yatır(miktar)
    elif işlem == 5:
        çekilecek_para = int(input("Çekmek istediğiniz tutarı giriniz: "))
        banka.para_çek(çekilecek_para)
    elif işlem == 6:
        banka.bakiye_sorgula()
    elif işlem == 7:
        banka.kredi_mevduatı_oluştur()
    elif işlem == 8:
        banka.kredi_borcu_öde()
    elif işlem == 9:
        banka.fatura_öde()
    elif işlem == 10:
        banka.çıkış()
    else:
        print("Hatalı işlem...")
        time.sleep(2)
        continue

Bu da kütüphane isimli çalışmam. bakın burda sqlite i her fonksiyonda kullanmışım. Normal olan bu diye düşünüyorum.

import sqlite3

import time

class Kitap():

    def __init__(self,isim,yazar,yayınevi,tür,baskı):

        self.isim = isim
        self.yazar = yazar
        self.yayınevi = yayınevi
        self.tür = tür
        self.baskı = baskı

    def __str__(self):

        return "Kitap İsmi: {}\nYazar: {}\nYayınevi: {}\nTür: {}\nBaskı: {}\n".format(self.isim,self.yazar,self.yayınevi,self.tür,self.baskı)


class Kütüphane():

    def __init__(self):

        self.baglanti_olustur()

    def baglanti_olustur(self):

        self.baglanti = sqlite3.connect("kütüphane.db")

        self.cursor = self.baglanti.cursor()

        sorgu = "Create Table If not exists kitaplar (isim TEXT,yazar TEXT,yayınevi TEXT,tür TEXT,baskı INT)"

        self.cursor.execute(sorgu)

        self.baglanti.commit()
    def baglantiyi_kes(self):
        self.baglanti.close()

    def kitapları_goster(self):

        sorgu =  "Select * From kitaplar"

        self.cursor.execute(sorgu)

        kitaplar = self.cursor.fetchall()

        if (len(kitaplar) == 0):
            print("Kütüphanede kitap bulunmuyor...")
        else:
            for i in kitaplar:

                kitap = Kitap(i[0],i[1],i[2],i[3],i[4])
                print(kitap)

    def kitap_sorgula(self,isim):

        sorgu = "Select * From kitaplar where isim = ?"

        self.cursor.execute(sorgu,(isim,))

        kitaplar = self.cursor.fetchall()

        if (len(kitaplar) == 0):
            print("Böyle bir kitap bulunmuyor.....")
        else:
            kitap = Kitap(kitaplar[0][0],kitaplar[0][1],kitaplar[0][2],kitaplar[0][3],kitaplar[0][4])

            print(kitap)
    def kitap_ekle(self,kitap):

        sorgu = "Insert into kitaplar Values(?,?,?,?,?)"

        self.cursor.execute(sorgu,(kitap.isim,kitap.yazar,kitap.yayınevi,kitap.tür,kitap.baskı))

        self.baglanti.commit()

    def kitap_sil(self,isim):

        sorgu = "Delete From kitaplar where isim = ?"

        self.cursor.execute(sorgu,(isim,))

        self.baglanti.commit()

    def baskı_yükselt(self,isim):

        sorgu = "Select * From kitaplar where isim = ?"

        self.cursor.execute(sorgu,(isim,))


        kitaplar = self.cursor.fetchall()

        if (len(kitaplar) == 0):
            print("Böyle bir kitap bulunmuyor...")
        else:
            baskı = kitaplar[0][4]

            baskı += 1

            sorgu2 = "Update kitaplar set baskı = ? where isim = ?" #baskıyı güncelleme. Update metodu ile güncelleme yapılır. set ile hangi sütunun güncelleneceği belirtilir. where ile hangi satırın güncelleneceği belirtilir.

            self.cursor.execute(sorgu2,(baskı,isim))

            self.baglanti.commit()

Sinifin gorevi arkadaki bir veritabani uzerinde islemler yapmak oldugu icin sinifin metodlari veritabanini kullanan islemler yapabilir. “Baglanti aciksa direkt kullan, degilse once ac” gibi bir kontrol ile baslayabilirler.

Veritabanini kullanmayan metodlar da gayet normal. “Veritabani kullanan sinifta ne isleri var” diye bir sorgulamak lazim, ama cevap olumluysa var olmalarinin bir sakincasi yok.

Veritabanina ihtiyaclari yoksa kullanmalari sart degil.

Bu biraz daha temiz bir tasarim, evet. Ama yapmaya calistigi is de daha basit.

Ben mesela kullaniciyla etkilesime giren katmani (print, input, sleep) database’le konusan katmandan tamamen ayirirdim, en az iki farkli sinif ile. Ama tabi kodu yazmak cok daha zorlasirdi.

Ben direk soyle bir hata aliyorum:

  File "/tmp/a.py", line 147, in <module>
    banka = Banka()
TypeError: __init__() missing 7 required positional arguments: 'isim', 'bakiye', 'şifre', 'kart_no', 'kart_limiti', 'kart_bakiyesi', and 'havale'

Teşekkür ederim. Peki “missing 7 required positional arguments” hatasında ki 7 argümanı nereye koymam gerektiği hakkında bir fikrin var mı?

Belki de tek hata bu değil. biraz daha araştırp geliştirmeliyim kodumu. Ama bu 7 argümanı nereye koymam gerektiği hakkında fikir vermek istersen o da iyi olur.