Sql & Veritabanı İle Uygulamalar İçin Veri İçe Aktarma İşlemi Nasıl Yapılır?

Sql & Veritabanı İle Uygulamalar İçin Veri İçe Aktarma İşlemi Nasıl Yapılır?
Sql & Veritabanı İle Uygulamalar İçin Veri İçe Aktarma İşlemi Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Veri içe aktarma işlemine başlamadan önce çalışma ortamınızın hazır olduğundan emin olmalısınız. 2026 yılı itibarıyla standart bir geliştirme ortamında şu araçların kurulu olması önerilir:

  • Veritabanı Yönetim Sistemi: PostgreSQL 17+ veya MySQL 9+ sürümü.
  • Programlama Dili: PHP 8.4 veya Python 3.13 (Veri işleme mantığı için).
  • Veritabanı İstemcisi: DBeaver veya pgAdmin gibi görsel araçlar.
  • Veri Formatları: Standart yapılandırılmış CSV veya JSON dosyaları.

Ayrıca, veritabanı üzerinde yazma yetkisine sahip bir kullanıcı hesabınızın olduğundan ve gerekli tablo yapılarının (schema) önceden tanımlandığından emin olun.

Adım 1: Veri Kaynağını Hazırlama ve Temizleme

Veri içe aktarma işlemindeki en kritik aşama, verinin temizliğidir. Hatalı veya eksik veriler, veritabanı kısıtlamalarına (constraints) takılarak işlemin yarıda kesilmesine neden olabilir. CSV dosyanızın başlıklarının veritabanı sütun isimleriyle eşleştiğinden emin olun.

Aşağıdaki örnekte, bir CSV dosyasını okuyup veritabanına hazır hale getirecek basit bir PHP mantığı yer almaktadır:


// CSV dosyasını okuma ve diziye aktarma
$dosyaAdi = 'kullanicilar.csv';
$veriler = [];

if (($handle = fopen($dosyaAdi, "r")) !== FALSE) {
    $basliklar = fgetcsv($handle, 1000, ",");
    while (($satir = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $veriler[] = array_combine($basliklar, $satir);
    }
    fclose($handle);
}
// $veriler dizisi artık veritabanına eklenmeye hazır.

Bu işlem, veriyi belleğe alarak satır satır işlenebilir hale getirir. Büyük dosyalarda belleği korumak için "Generator" yapılarını kullanmanız önerilir.

Adım 2: SQL ile Toplu Veri Ekleme (Bulk Insert)

Verileri tek tek eklemek yerine, INSERT sorgularını toplu olarak çalıştırmak performans açısından hayati öneme sahiptir. 1000 satırlık bir veriyi 1000 ayrı sorgu yerine tek bir sorgu bloğu ile göndermek, veritabanı üzerindeki yükü ciddi oranda azaltır.


-- Toplu veri ekleme örneği
INSERT INTO kullanicilar (ad, soyad, eposta) VALUES 
('Ahmet', 'Yılmaz', 'ahmet@example.com'),
('Ayşe', 'Demir', 'ayse@example.com'),
('Mehmet', 'Kaya', 'mehmet@example.com');

Bu yöntem, özellikle büyük veri setlerinde işlemin saniyeler içinde tamamlanmasını sağlar. Ancak, her satırın doğruluğundan emin olmalısınız.

Adım 3: Güvenli Veri Aktarımı ve SQL Injection Koruması

Veri içe aktarırken en büyük risk, dış kaynaklı verilerin SQL sorgularına doğrudan enjekte edilmesidir. Bu durum SQL Injection açıklarına yol açar. Her zaman "Prepared Statements" (Hazırlanmış İfadeler) kullanmalısınız.


// PDO ile güvenli veri ekleme
$pdo = new PDO('mysql:host=localhost;dbname=test_db', 'kullanici', 'sifre');
$stmt = $pdo->prepare("INSERT INTO kullanicilar (ad, eposta) VALUES (:ad, :eposta)");

foreach ($veriler as $kullanici) {
    $stmt->execute([
        ':ad' => htmlspecialchars($kullanici['ad']),
        ':eposta' => filter_var($kullanici['eposta'], FILTER_SANITIZE_EMAIL)
    ]);
}

Bu kod bloğu, veriyi veritabanına göndermeden önce temizler ve sorgudan ayırarak güvenli bir giriş sağlar.

Kritik Uyarı: Üretim ortamında veri aktarımı yaparken her zaman bir "Transaction" (İşlem bloğu) kullanın. Eğer 1000 satırın 999'u başarılı olup 1'i hata verirse, tüm işlemi geri alarak veritabanının tutarlılığını koruyabilirsiniz.

Adım 4: Veri Doğrulama ve Hata Yönetimi

İçe aktarma sırasında verilerin veritabanı şemasına uygunluğunu kontrol etmek gerekir. Örneğin, bir yaş sütununa metin gelmesi işlemi durdurabilir. Hata yönetimi için bir loglama mekanizması kurmalısınız.


try {
    $pdo->beginTransaction();
    // Veri ekleme işlemleri...
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    error_log("Veri aktarımı başarısız: " . $e->getMessage());
}

Bu yapı, işlemin hata anında güvenli bir şekilde sonlanmasını ve hatanın log dosyasına kaydedilmesini sağlar.

Adım 5: Farklı Yöntemlerin Karşılaştırılması

Veri aktarımı için kullanılan farklı yöntemlerin avantaj ve dezavantajlarını aşağıda görebilirsiniz:

Yöntem Avantaj Dezavantaj
SQL INSERT Basit, kontrol edilebilir Büyük veride yavaş
CSV Import (COPY) Çok hızlı Veri temizleme zor
ORM (Eloquent vb.) Güvenli, kolay Performans kaybı olabilir

Adım 6: Büyük Veri Setleri İçin İpuçları

Eğer milyonlarca satırlık bir veri aktaracaksanız, standart yöntemler yetersiz kalacaktır. Bu durumda veritabanının yerel "Bulk Load" araçlarını kullanmalısınız. Örneğin, PostgreSQL'in COPY komutu, bir dosyayı doğrudan tabloya en hızlı şekilde aktaran yöntemdir.


-- PostgreSQL COPY örneği
COPY kullanicilar(ad, soyad, eposta)
FROM '/tmp/veri.csv'
DELIMITER ','
CSV HEADER;

Bu komut, uygulama katmanını atlayarak doğrudan veritabanı motoru üzerinde çalıştığı için en yüksek performansı sunar.

Güvenlik Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Uygulamanızda kullanmadan önce veritabanı bağlantı bilgilerini gizli tutun (ENV dosyaları kullanın) ve tüm dış verileri mutlaka doğrulayın.

Sıkça Sorulan Sorular

Veri içe aktarırken "Duplicate Entry" hatası alırsam ne yapmalıyım?

Bu hata, veritabanındaki "Unique" (Benzersiz) anahtar kısıtlamasına takıldığınızı gösterir. Sorgularınıza INSERT IGNORE veya ON DUPLICATE KEY UPDATE ifadelerini ekleyerek mevcut verilerin güncellenmesini sağlayabilirsiniz.

CSV dosyamda karakter bozuklukları oluyor, nasıl çözerim?

Dosyanızın UTF-8 kodlamasıyla kaydedildiğinden emin olun. PHP veya Python ile okuma yaparken dosya kodlamasını açıkça belirterek (örneğin UTF-8 BOM'suz) bu sorunu aşabilirsiniz.

İçe aktarma işlemi sırasında sunucu zaman aşımına uğruyor, ne yapmalıyım?

Veriyi küçük parçalara (chunk) bölerek aktarın. Örneğin, 1000'er satırlık döngülerle işlemi gerçekleştirin ve her döngüden sonra belleği temizleyin.

JSON verilerini nasıl içe aktarırım?

JSON verileri için json_decode() fonksiyonunu kullanarak veriyi bir diziye çevirin ve ardından yukarıdaki SQL yöntemlerini kullanarak veritabanına kaydedin.

Veritabanı şeması ile CSV sütunları eşleşmiyorsa ne yapmalıyım?

Kod tarafında bir "Mapping" (Eşleştirme) dizisi oluşturun. CSV başlıklarını, veritabanı sütun isimleriyle eşleştiren bir anahtar-değer yapısı kurarak veriyi dinamik olarak eşleyin.

Veri Aktarım Süreçlerinde Otomasyon ve Zamanlanmış Görevler

Veri içe aktarma işlemleri genellikle tek seferlik değil, periyodik olarak tekrarlanması gereken süreçlerdir. Özellikle CRM sistemleri, stok takip yazılımları veya finansal raporlama araçları, dış kaynaklardan gelen verileri sürekli güncel tutmak zorundadır. Bu noktada manuel süreçleri terk edip, otomasyon araçlarına geçiş yapmak hata payını minimize eder.

Linux tabanlı sunucularda Cron Job kullanarak, belirli bir dizine düşen CSV dosyalarını otomatik olarak veritabanına işleyen bir Python scripti kurgulayabilirsiniz. Aşağıdaki örnek, bir klasörü izleyen ve yeni dosyaları işleyen temel bir mantığı göstermektedir:

import pandas as pd
import sqlalchemy
import os

# Veritabanı bağlantısı
engine = sqlalchemy.create_engine('mysql+mysqlconnector://user:pass@localhost/db_name')

def process_new_files(directory):
    for filename in os.listdir(directory):
        if filename.endswith(".csv"):
            file_path = os.path.join(directory, filename)
            # Veriyi oku ve işle
            df = pd.read_csv(file_path)
            df.to_sql('hedef_tablo', con=engine, if_exists='append', index=False)
            # İşlenen dosyayı taşı
            os.rename(file_path, os.path.join(directory, 'processed', filename))

process_new_files('/var/data/imports')

Veri Bütünlüğü İçin İşlem (Transaction) Yönetimi

Toplu veri aktarımlarında karşılaşılan en büyük risklerden biri, işlemin yarısında meydana gelen bir hata sonucu veritabanının "yarı dolu" veya "tutarsız" bir durumda kalmasıdır. Bu durumu engellemek için ACID prensiplerine uygun olarak Transaction (İşlem) yapısını kullanmalısınız.

Bir işlem bloğu açtığınızda, tüm veriler başarıyla yazılana kadar veritabanı değişikliği kalıcı hale gelmez. Eğer 10.000 satırlık bir verinin 5.000'inci satırında bir hata oluşursa, ROLLBACK komutu ile tüm işlemi geri alabilir ve veritabanını temiz tutabilirsiniz.

-- SQL Transaction Örneği
START TRANSACTION;

INSERT INTO musteriler (ad, soyad, email) VALUES ('Ahmet', 'Yılmaz', 'ahmet@example.com');
INSERT INTO musteriler (ad, soyad, email) VALUES ('Ayşe', 'Demir', 'ayse@example.com');

-- Eğer bir hata oluşursa:
-- ROLLBACK;

-- Her şey yolundaysa:
COMMIT;

İşlem Hızını Artırmak İçin İndeks Stratejileri

Veri aktarımı sırasında tablonuzda çok sayıda Index bulunması, her yeni satır eklendiğinde indeks ağaçlarının güncellenmesine neden olur ve yazma hızını ciddi oranda düşürür. Profesyonel veri aktarım stratejisi şu şekildedir:

  1. Aktarım öncesi tablodaki indeksleri (Primary Key hariç) geçici olarak kaldırın (DROP INDEX).
  2. Verileri toplu halde (Bulk Insert) içeri aktarın.
  3. Aktarım tamamlandıktan sonra indeksleri tekrar oluşturun (CREATE INDEX).

Bu yöntem, özellikle milyonlarca satırlık verilerin aktarıldığı büyük ölçekli veritabanı operasyonlarında, işlemin tamamlanma süresini %60'a varan oranlarda kısaltabilir.

Sonuç

Sql & veritabanı ile uygulamalar için veri içe aktarma işlemi, doğru araçlar ve güvenlik önlemleriyle oldukça verimli bir sürece dönüşebilir. Küçük projelerde basit SQL sorguları yeterli olurken, büyük ölçekli sistemlerde COPY gibi performans odaklı komutlara yönelmek profesyonel bir yaklaşımdır. Bir sonraki adım olarak, veritabanı indeksleme stratejilerini öğrenerek veri okuma hızınızı da veri girişi hızınız kadar optimize etmeyi hedefleyebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Yaratıcı problem çözme teknikleri üzerine odaklanan bir içerik editörüyüm. Hayatı pratikleştiren tüyolarla okuyucuya zaman kazandırmayı hedefleyen yazılar kurguluyorum.

Yorumlar (0)

Yorum Yaz