- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
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.
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ı.")
Bu bölüm, veritabanına kayıt eklerken izlenmesi gereken temel adımları ve performans için toplu ekleme yöntemini göstermektedir.
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.
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.
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.
Python'da MySQL veritabanına veri kaydederken %s kullanmanızın iki temel ve hayati nedeni vardır:
%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.
%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.
Yorumlar
Yorum Gönder