Önceki iki derste öğrendiklerimizi (Telegram botu ve MySQL bağlantısı) birleştirerek, kullanıcıların komutlarla veritabanına kayıt ekleyip listeleyebildiği ve silebildiği bir bot yapacağız — hem de birden fazla kişi aynı anda kullanabilecek şekilde, çünkü veri artık yerel bir dosyada değil, merkezi bir MySQL sunucusunda tutuluyor.
Tabloyu Oluşturmak
def tablo_olustur(cursor):
sorgu = (
"CREATE TABLE IF NOT EXISTS kayitlar ("
"id INTEGER PRIMARY KEY AUTO_INCREMENT, "
"ad VARCHAR(100), "
"yas INTEGER, "
"kayit_tarihi VARCHAR(100))"
)
cursor.execute(sorgu)
CREATE TABLE IF NOT EXISTS, tablo zaten varsa hata vermeden atlar — bu, botu her başlattığınızda güvenle çağırabileceğiniz bir kalıptır.
/ekle Komutu
from datetime import datetime
def ekle_command(update, context):
try:
ad, yas = context.args[0], context.args[1]
except (IndexError, ValueError):
update.message.reply_text("Kullanım: /ekle Ad Yaş")
return
tarih = datetime.now().strftime("%d-%m-%Y")
cursor.execute(
"INSERT INTO kayitlar (ad, yas, kayit_tarihi) VALUES (%s, %s, %s)",
(ad, yas, tarih),
)
baglanti.commit()
update.message.reply_text("Kayıt başarıyla eklendi.")
context.args, kullanıcının komuttan sonra yazdığı kelimeleri bir liste olarak verir — /ekle Ahmet 24 yazıldığında context.args ["Ahmet", "24"] olur.
Kritik nokta: %s yer tutucularını kullanıp değerleri execute()'un ikinci parametresi olarak ayrı vermek — sorguyu doğrudan Python string birleştirmesiyle (f"...{ad}...") oluşturmak yerine — SQL enjeksiyonuna karşı korunmanın standart yoludur. Kullanıcıdan gelen veri asla doğrudan sorgu metnine eklenmemelidir.
/listele Komutu
def listele_command(update, context):
cursor.execute("SELECT * FROM kayitlar")
satirlar = cursor.fetchall()
if not satirlar:
update.message.reply_text("Henüz kayıt yok.")
return
mesaj = "\n".join(f"{satir[1]} - {satir[2]} yaş" for satir in satirlar)
update.message.reply_text(mesaj)
/sil Komutu
def sil_command(update, context):
try:
kayit_id = context.args[0]
except IndexError:
update.message.reply_text("Kullanım: /sil <id>")
return
cursor.execute("DELETE FROM kayitlar WHERE id = %s", (kayit_id,))
baglanti.commit()
update.message.reply_text("Kayıt silindi.")
Çok Kullanıcılı Çalışma Avantajı
Bu yapının en büyük artısı, verinin yerel bir .db dosyasında değil merkezi bir MySQL sunucusunda tutulmasıdır — bot hangi cihazdan/hesaptan çalıştırılırsa çalıştırılsın, herkes aynı veriye erişir ve aynı anda kayıt ekleyip görebilir.
Sırada Ne Var?
Telegram ve veritabanı konularını burada bırakıp, sıradaki üç derste PyQt5 ile bir masaüstü kayıt uygulaması yapacağız — önce arayüz tasarımıyla başlıyoruz.