Kullanıcı girdisini SQL sorgusuna dahil etmek

Python’da sqlite ile öğrencilerin sınavlarını kaydeden ve öğrenci numarasını girildiğinde sınav notlarını kullanıcıya gösteren uygulama yapmaya çalışıyorum. Sınav notlarını veritabanına kayıt ederken sıkıntıyla karşılaştım. Şu şekilde kullanıcı girdisi ile öğrenciyi veritabanına başarılı bir şekilde kaydedebiliyorum

 numara = input("Numara: ")
 ad = input("Ad: ")
 soyad = input("Soyad: ")

 imlec.execute("""INSERT INTO notlar(ogrenci_no, ad, soyad)
                 VALUES(?,?,?)""", (numara, ad, soyad))

Ancak sınav notlarını girmek için sorguya WHERE ekleyince ‘?’ hata veriyor:

 ogrenci = input("Sınav notunu gireceğiniz öğrencinin numarası: ")
 try:
     puan = int(input("Sınavdan aldığı puan: "))
 except ValueError:
     print("Lütfen sınav puanını girmek için harfleri yerine rakamları kullanın!\n")

 imlec.execute("INSERT INTO notlar(sınav1) VALUES(?) WHERE ogrenci_no = ?"
                  ,(puan, ogrenci))

Hata:

sqlite3.OperationalError: near "WHERE": syntax error

Sorgu içindeki ikinci parantezi kaldırmayı denedim ama bu sefer sql sorgusu en fazla 2 eleman alır siz 3 verdiniz gibi bir hata veriyor :slight_smile: Kodlarda nasıl bir düzenleme yapmam gerekiyor yardımcı olur musunuz.

1 Beğeni

Sizin ilk başta oluşturduğunuz tablonun ismi notlar, ama ikinci yazdığınız kodlarda kullandığınız tablo notlar(sınav1), iki farklı tablo mu kullanıyorsunuz?

Onu yazmayı unutmuşum pardon tabloyu şu şekilde oluşturdum

imlec.execute("""CREATE TABLE IF NOT EXISTS notlar('ogrenci_no' PRIMARY KEY NOT NULL,
              ad NOT NULL,   soyad NOT NULL,   sınav1 INTEGER,   sınav2 INTEGER,
              sınav3 INTEGER)""")

yani notlar(sınav1) ile notlar tablosunun sınav1 kolonunu seçmek istedim aslında

Sizinle bir kod paylaşmam mümkün müdür acaba? Bir inceleseniz?

tabi :slight_smile: memnun olurum

Bilmem işinize yarar mı ama bir bakın isterseniz:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sqlite3 as sql

connect = sql.connect("test.db")
cursor = connect.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS veriler(no)")


def sutun_ekle(sutun):
    """Sütun ekler."""
    cursor.execute("ALTER TABLE veriler ADD COLUMN {}".format(sutun))
    connect.commit()


def sutun_sil(korunacak_sutunlar):
    """korunacak_sutunlar listesine alınmayan sütun otomatik
    olarak silinir."""
    cursor.execute("CREATE TABLE IF NOT EXISTS yedek({})".format(", ".join(korunacak_sutunlar)))
    for i in cursor.execute("SELECT {} FROM veriler".format(", ".join(korunacak_sutunlar))):
        cursor.execute("INSERT INTO yedek VALUES({})".format(", ".join("?" * len(korunacak_sutunlar))), i)
    cursor.execute("DROP TABLE veriler")
    cursor.execute("ALTER TABLE yedek RENAME TO veriler")
    connect.commit()


def veri_ekle(*args):
    """Bu fonksiyonu kullanabilmek için önce sutun_ekle() fonksiyonu
    çağrılarak sutunlar oluşturulmalıdır. Sonra da veri_ekle() fonksiyonu ile
    veriler tabloya eklenebilir."""
    no = 1
    for _ in cursor.execute("SELECT * FROM veriler"):
        no += 1
    veri = tuple()
    veri += no,
    for i in args:
        veri += i,
    cursor.execute("INSERT INTO veriler VALUES({})".format(", ".join("?" * len(veri))), veri)
    connect.commit()


def veri_degistir(no, sec, yeni):
    """Veri numarasına göre verileri değiştirir."""
    cursor.execute("UPDATE veriler SET {} = ? WHERE no = ?".format(sec), (yeni, no))
    connect.commit()


def veri_sil(no):
    """Veri satırını, satır numarasına göre siler."""
    cursor.execute("DELETE FROM veriler WHERE no = ?", (no,))
    connect.commit()


if __name__ == "__main__":
    # Diyelim aşağıdaki sütunları sınavlar yapılmadan önce oluşturduk.
    sutun_ekle(sutun="ogrenci_no")
    sutun_ekle(sutun="ad")
    sutun_ekle(sutun="soyad")

    # Öğrencileri de aşağıdaki gibi eklediniz.
    veri_ekle(12345, "Ali", "Güneş")
    veri_ekle(65656, "Aslı", "Çalışkan")

    # Daha sonra sınav zamanı geldiğinde sınav1 isimli bir sütun oluşturabilirsiniz.
    sutun_ekle(sutun="sınav1")

    # Yeni sütun oluştu ve her satırda sınav1 sütunun değeri NULL oldu.
    # Şimdi her bir satırdaki NULL değeri değiştirebiliriz.
    veri_degistir(no=1, sec="sınav1", yeni=85)
    veri_degistir(no=2, sec="sınav1", yeni=75)
    
    # Veya sütunları oluştururken sınav1, sınav2 ve sınav3 sütunlarını da ekleyebilirsiniz.
    # Bu sütunlara geçici değerler verip, sınav sonuçlarını açıkladıktan
    # sonra da bu değerleri yukarıdaki gibi değiştirirsiniz.

2 Beğeni

Amatörlükten biraz geç anladım ama gerçekten aydınlatıcı oldu, teşekkür ederim. :slight_smile:

İşe yaradığına sevindim, iyi çalışmalar dilerim.