Resim

MySQL Insert (Veri Eklemek)

MySQL Insert (Veri Eklemek)

Artık musteriler tablomuz hazır. Veritabanının asıl amacı olan veri depolama işlemine geçebiliriz. Bu bölümde, Python kodundaki değişkenleri alıp, oluşturduğumuz tabloya güvenli bir şekilde nasıl kaydedeceğimizi öğreneceğiz. Tek bir kayıt eklemek ve performans için toplu kayıt eklemek arasındaki farkı göreceğiz. En önemlisi, veri eklerken neden %s yer tutucusunu kullanmamız gerektiğini ve mydb.commit() komutunun ne anlama geldiğini detaylıca açıklayacağız. 

Kodun Tamamı (Tek Kayıt Ekleme)

insert_data.py adında yeni bir dosya oluşturun:

import mysql.connector 
from config import DB_CONFIG
try:
    mydb = mysql.connector.connect(**DB_CONFIG)
    mycursor = mydb.cursor()
    print(f"'{DB_CONFIG['database']}' veritabanına başarılı şekilde bağlanıldı.")    
    # 1. SQL Sorgusunu Tanımlama 
    #(Değerler yerine %s placeholder'ları kullanıyoruz)
    SQL = "INSERT INTO musteriler (isim, email, kayit_tarihi) VALUES (%s, %s, %s)"  
    # 2. Eklenecek Verileri Tanımlama (Python tuple/demet)
    # Python'ın güvenlik için kullanacağı değişkenleri içeren tuple
    veri = ("Emre Alan", "emre@mail.com", "2024-01-15")   
    # 3. Sorguyu Çalıştırma
    # execute metoduna sorgu (SQL) ve verileri (veri) 
    # AYRI AYRI gönderiyoruz.
    mycursor.execute(SQL, veri)  
    # 4. Değişikliği Veritabanına Kaydetme (KALICILAŞTIRMA)
    mydb.commit()   
    # Başarı mesajı
    print("\nTek kayıt başarıyla eklendi.")
    # Otomatik artan ID'yi göster
    print(f"Eklenen kaydın ID'si: {mycursor.lastrowid}") 
    
    # ----------------------------------------------------
    # BİRDEN FAZLA KAYIT EKLEME
    # ----------------------------------------------------    
    # 1. Eklemek istediğimiz verilerin listesi 
    # (Her eleman bir tuple olmalı)
    #veriler = [
    #    ("Ayşe Demir", "ayse@mail.com", "2024-01-20"),
    #    ("Mehmet Kaya", "mehmet@mail.com", "2024-02-01"),
    #    ("Zeynep Çelik", "zeynep@mail.com", "2024-02-05")
    #]    
    # 2. execute many komutunu kullanma
    # Aynı SQL sorgusunu kullanarak listedeki tüm verileri 
    # tek seferde gönderir.
    #mycursor.executemany(SQL, veriler)    
    # 3. Değişikliği Veritabanına Kaydetme 
    #(Yeni eklenen 3 kaydı kalıcı yapar)
    #mydb.commit()
    
    # Başarı mesajı
    #print(f"\nToplam {mycursor.rowcount} kayıt daha 
    #başarıyla eklendi.")
    
except mysql.connector.Error as err:
    # Bağlantı veya diğer hatalar
    print(f"\nBağlantı/İşlem hatası: {err}")
    print("Lütfen bağlantı ayarlarını ve MySQL sunucu durumunu kontrol edin.")
finally:
    # Bağlantıları kapatma (Temizlik)
    if 'mycursor' in locals() and mycursor:
        mycursor.close()
    if 'mydb' in locals() and mydb and mydb.is_connected():
        mydb.close()
        print("MySQL bağlantısı kapatıldı.")

Kodun Açıklaması

Bu bölüm, veritabanına kayıt eklerken izlenmesi gereken temel adımları ve performans için toplu ekleme yöntemini göstermektedir.

1. Tek Kayıt Ekleme

  • Güvenli SQL Sorgusu: SQL = "INSERT INTO ... VALUES (%s, %s, %s)" satırında, eklenecek değerler yerine %s yer tutucuları kullanılır. Bu yer tutucular, verilerin güvenli bir şekilde sorguya eklenmesini sağlar (Ayrıntılı açıklama aşağıdadır).

  • Veri Tanımlama: Eklenecek değerler, veri adında bir tuple (demet) içinde tanımlanır. Tuple'daki değer sırası, SQL sorgusundaki sütun sırasına uymalıdır.

  • Sorguyu Çalıştırma: mycursor.execute(SQL, veri) komutu, SQL sorgusunu ve veriyi ayrı parametreler olarak alır. Bu, SQL güvenliğini sağlayan ana mekanizmadır.

  • ID Alma: mycursor.lastrowid özelliği, otomatik artan (AUTO_INCREMENT) olarak ayarladığımız id sütunundaki yeni eklenen kaydın değerini anında almamızı sağlar.

2. Birden Fazla Kayıt Ekleme (executemany)

  • Veri Listesi: veriler listesi, her biri eklenecek bir kaydı temsil eden birden fazla tuple (demet) içerir.

  • Performans: mycursor.executemany(SQL, veriler) komutu, her bir kayıt için ayrı ayrı execute çalıştırmak yerine, veritabanına tek bir optimize edilmiş komut gönderir. Bu, büyük miktarda veri eklerken çok daha hızlıdır.

  • Kayıt Sayısı: mycursor.rowcount özelliği, executemany çalıştırıldıktan sonra eklenen toplam kayıt sayısını verir.


KRİTİK BİLGİ: mydb.commit() Ne İşe Yarar?

Veritabanı işlemleri İşlemler (Transactions) prensibine dayanır.

  • INSERT (veya UPDATE, DELETE) komutunu çalıştırdığınızda, bu değişiklikler hemen veritabanının ana dosyalarına kalıcı olarak yazılmaz. Bu değişiklikler, mevcut işlem içinde "beklemede" (geçici) kalır.

  • mydb.commit() komutunu kullandığınızda, bekleyen tüm bu değişiklikler (eklenen, güncellenen veya silinen tüm veriler) kalıcı olarak veritabanına kaydedilir ve diğer kullanıcılar/bağlantılar tarafından görülebilir hale gelir.

  • Eğer commit() komutunu kullanmazsanız ve program kapanırsa veya bir hata oluşursa, yapılan tüm değişiklikler kaybolur. Başarılı bir commit işleminden sonra ise, yapılan değişiklikler artık geri alınamaz.


GÜVENLİK VE TİP DÖNÜŞÜMÜ: Neden %s Kullanıyoruz?

Python'da MySQL veritabanına veri kaydederken %s kullanmanızın iki temel ve hayati nedeni vardır:

1. SQL Enjeksiyonunu Önleme (Güvenlik)

  • %s bir yer tutucudur (placeholder) ve veritabanı sürücüsüne (MySQL Connector/Python) bu konuma bir değerin geleceğini söyler.

  • Siz cursor.execute(SQL, veri) komutunu çalıştırdığınızda, sürücü, kullanıcıdan gelen veriyi otomatik olarak temizler ve güvenli bir şekilde tırnak içine alır. Bu işleme Prepared Statement denir.

  • Bu yöntem, kötü niyetli bir kullanıcının sorguyu manipüle etmesini sağlayan SQL Enjeksiyonu saldırılarına karşı en etkili ve en basit savunmadır.

2. Otomatik Tip Dönüşümü

  • %s sadece metin (string) anlamına gelmez. MySQL sürücüsü, kendisinden sonra gelen Python değişkeninin veri tipine (string, integer, float, datetime) bakar.

  • Sürücü, bu Python tipini, MySQL'in anlayacağı uygun SQL formatına (ve gerekiyorsa tırnak içine) otomatik olarak dönüştürür. Örneğin:

    • Bir Python str için etrafına 'tırnak' ekler.

    • Bir Python int veya float için tırnak eklemez.

    • Bir Python date nesnesini uygun YYYY-MM-DD formatına dönüştürür.

  • Bu sayede, farklı veri tiplerini veritabanına kaydederken tırnak işaretleriyle veya formatlamayla uğraşmanıza gerek kalmaz.


Not: Eğer çalıştırma sırasında Can't connect to MySQL server on 'localhost:3306' gibi bir hata alırsanız, bu büyük ihtimalle MySQL sunucu hizmetinizin durmuş olduğu anlamına gelir. Lütfen Hizmetler (Services) penceresini açın, MySQL80 (veya kurulu olan versiyon) hizmetini bulun ve çalışır durumda olduğundan emin olun. Durdurulmuşsa, sağ tıklayıp "Başlat" seçeneğiyle tekrar başlatın.

📹ÖĞRENDİKLERİNİZİ PEKİŞTİRİN:
Hemen aşağıdaki videomuza tıklayın. Adım adım ilerleyerek öğrendiklerinizi görsel olarak pekiştirin ve bir sonraki konuya hatasız bir şekilde geçin!




Yorumlar

Bu blogdaki popüler yayınlar

Python random Modülü

Python print()

Yazılım Nedir?