# 🔄 Restore İşlemi Düzeltildi - UYARI! ⚠️

## ❌ Eski Sorun
Restore işlemi mevcut veritabanına eklemeye çalışıyordu, bu yüzden:
- "relation already exists" hataları
- "duplicate key value" hataları
- "syntax error at or near order" hatası
- Veriler restore olmuyordu

## ✅ Yeni Çözüm

Restore işlemi şimdi şu şekilde çalışıyor:

### 1. Veritabanını Tamamen Siler
```sql
DROP DATABASE IF EXISTS "your_db";
CREATE DATABASE "your_db";
```

### 2. Temiz Veritabanına Restore Eder
- Tüm tablolar yeniden oluşturulur
- Tüm veriler temiz şekilde eklenir
- Hiçbir "already exists" hatası olmaz

### 3. Syntax Hatalarını Düzeltir
```python
# "order" reserved keyword hatası düzeltilir
order INTEGER NOT NULL  →  "order" INTEGER NOT NULL
```

## ⚠️ ÖNEMLİ UYARILAR

### 🚨 RESTORE İŞLEMİ MEVCUTVERİLERİ SİLER!

**Restore yapmadan önce:**
1. ✅ Mevcut veritabanınızdan yedek alın
2. ✅ Yedeği indirin ve güvenli bir yerde saklayın
3. ✅ Restore edeceğiniz SQL dosyasının doğru olduğundan emin olun
4. ✅ Test ortamında deneyip sonra production'da yapın

### 📋 Restore İşlemi Nasıl Çalışır?

```
1. PostgreSQL'e 'postgres' veritabanı ile bağlan
2. Hedef veritabanındaki tüm bağlantıları kes
3. Hedef veritabanını sil (DROP DATABASE)
4. Yeni boş veritabanı oluştur (CREATE DATABASE)
5. Yeni veritabanına bağlan
6. SQL dosyasını çalıştır
7. Tüm tabloları ve verileri oluştur
```

## 🚀 Kullanım

### Admin Panelden Restore

1. **Yedek al (güvenlik için):**
   ```
   Admin Panel → Database backups → 🔄 Yeni Yedek Al
   ```

2. **Restore edilecek yedeği seç:**
   ```
   Checkbox ile yedeği seç
   ```

3. **Restore et:**
   ```
   Actions → "Seçili Yedeği Geri Yükle" → Go
   ```

4. **Onay:**
   ```
   ⚠️ "Mevcut veriler silinecek, emin misiniz?" mesajını kabul et
   ```

5. **Bekle:**
   ```
   Restore işlemi birkaç saniye sürebilir
   Django'nun yeniden başlamasını bekle
   ```

6. **Test et:**
   ```
   Admin panelde verileri kontrol et
   ```

## 🐛 Düzeltilen Hatalar

### 1. "relation already exists" Hatası
**Eski:** Mevcut tablolar üzerine CREATE TABLE çalıştırılıyordu
**Yeni:** Veritabanı tamamen silinip yeniden oluşturuluyor

### 2. "duplicate key value" Hatası
**Eski:** Mevcut kayıtlar üzerine INSERT yapılıyordu
**Yeni:** Temiz veritabanına kayıtlar ekleniyor

### 3. "syntax error at or near order" Hatası
**Eski:** `order` reserved keyword olarak kullanılıyordu
**Yeni:** Otomatik olarak `"order"` şeklinde escape ediliyor

```python
sql_content = sql_content.replace(
    '    order INTEGER NOT NULL,',
    '    "order" INTEGER NOT NULL,'
)
```

## 📊 Restore Süreci

```
┌─────────────────────────────────────────┐
│ 1. Yedek dosyası okunuyor...           │
├─────────────────────────────────────────┤
│ 2. PostgreSQL'e bağlanılıyor...        │
├─────────────────────────────────────────┤
│ 3. Mevcut bağlantılar kesiliyor...     │
│    pg_terminate_backend()               │
├─────────────────────────────────────────┤
│ 4. Veritabanı siliniyor...             │
│    DROP DATABASE                        │
├─────────────────────────────────────────┤
│ 5. Yeni veritabanı oluşturuluyor...    │
│    CREATE DATABASE                      │
├─────────────────────────────────────────┤
│ 6. SQL dosyası çalıştırılıyor...       │
│    - Tablolar oluşturuluyor             │
│    - Veriler ekleniyor                  │
│    - Sequence'ler ayarlanıyor           │
├─────────────────────────────────────────┤
│ 7. Tamamlandı! ✅                       │
└─────────────────────────────────────────┘
```

## 🔒 Güvenlik Önlemleri

### Otomatik Önlemler
- ✅ Mevcut bağlantılar otomatik kapatılır
- ✅ SQL injection koruması var
- ✅ Sadece admin/staff kullanıcıları restore yapabilir
- ✅ Hata durumunda işlem geri alınır

### Manuel Önlemler
- ⚠️ **ÖNEMLİ:** Production'da restore yapmadan önce yedek alın!
- ⚠️ Restore işlemi sırasında kimse veritabanını kullanmamalı
- ⚠️ Test ortamında deneyin
- ⚠️ Yedek dosyasının doğru olduğundan emin olun

## 📝 Test Senaryosu

### Senaryo: Production'dan Test'e Restore

```bash
# 1. Production'da yedek al
Admin Panel → Yeni Yedek Al → İndir

# 2. Test sunucusuna yükle
Admin Panel → Yedek Yükle → dosya seç → Yükle

# 3. Test sunucusunda restore et
Yedeği seç → Actions → Geri Yükle

# 4. Kontrol et
Verileri kontrol et
Test et

# 5. Başarılıysa production'da kullan
```

## 🆘 Sorun Giderme

### Restore başarısız oluyor
```bash
# Hata logunu kontrol et
Terminal'de Django çıktısına bak

# PostgreSQL logunu kontrol et
sudo tail -f /var/log/postgresql/postgresql-*.log
```

### "Cannot drop database because it is being accessed" Hatası
```bash
# Çözüm: Kod zaten mevcut bağlantıları kesiyor
# Eğer yine hata alıyorsanız, manuel kes:
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'your_db';
```

### Restore sonrası Django çalışmıyor
```bash
# Django'yu yeniden başlat
Ctrl+C (sunucuyu durdur)
python manage.py runserver

# Migration'ları kontrol et
python manage.py showmigrations
```

### Veriler restore olmadı
```bash
# SQL dosyasını kontrol et
head -50 backups/your_backup.sql

# Dosya boyutunu kontrol et
ls -lh backups/your_backup.sql

# Manuel restore dene (PostgreSQL)
psql -U user -d dbname -f backups/your_backup.sql
```

## ✅ Başarı Kontrol Listesi

Restore işleminden sonra kontrol edin:

- [ ] Tüm tablolar oluşturuldu mu?
- [ ] Kullanıcılar mevcut mu?
- [ ] Admin panele giriş yapabilir misiniz?
- [ ] Veriler doğru mu?
- [ ] İlişkiler (foreign keys) çalışıyor mu?
- [ ] Sequence'ler doğru mu? (yeni kayıt ekleyebiliyor musunuz?)

## 🎯 Sonuç

Artık restore işlemi düzgün çalışıyor:
- ✅ Mevcut veritabanı temizleniyor
- ✅ Yedek dosyası restore ediliyor
- ✅ Syntax hataları düzeltiliyor
- ✅ Hiçbir "already exists" hatası yok

**Ancak dikkatli olun:** Restore işlemi mevcut tüm verileri siler!

