Python sqlite3 bir datayı kopyalama

data1in içindekileri data2 diye boş bir dbye(ben kodun öncesinde açıyorum) kaydedicek internetten baktım birazda hata aldım her seferinde

Dosya olarak


bkz: Soru Sorarken Sıkça Düşülen Hatalar #3

data1.db nin içindekiler data2.dbye aktarcam neresi anlaşılmadı anlamadım

Birazda hata aldım kısmı anlaşılmamış olabilir mi?

Yardımcı olabilmek için ihtimalleri elememiz gerekiyor çünkü.

Bu veri tabanı uzak bir serverda mı? Bu server’dan datayı çekip başka bir konumdaki veri tabanına mı yazdırmaya çalışıyorsunuz mesela?

Bu durumda, erişim ve yetki hatası mı var veri tabanı sorguya açık mı vs bir sürü ihtimale neden olur?

Yok lokal bir veri tabanınız bir kopyasını almaya çalışıyorsunuz diyelim bu durumda her bir kaydı tek tek okuyup bir yeni veri tabanına mı eklemeye mi çalışıyorsunuz? Burada da bir sürü ihtimal var hataya neden olabilecek.

Ayrıca bir veri tabanından bir kayıt okuyup bir başka bir veri tabanına bunu kaydetmek veri tabanlarının en basit ve en kolay yaptığı işlem bunun neresinde nasıl bir sorun yaşamayı başardınız bilebilmemiz için, nasıl bir kod yazdınız, nasıl bir erişim metodunuz var nasıl bir yerde duruyor, hangi işletim sistemini kullanıyorsunuz gibi konularda biraz bilgi sahibi olsak fena olmaz mıydı?

data1 ve data2 nin kayıt yapısı aynı olmadığından dolayı veriler kopyalanamıyor olabilir. mesela birinci veritabanını ad, soyad, doğum tarihi diye oluşturmuşsunuzdur, ama ikinci veritabanını saat, dakika, tarih, yıl diye oluşturmuşsunuzdur, tip uyuşmazlığından kaydedemiyorsunuzdur.

Yani vermediğiniz bilgilerden dolayı milyonlarca varyasyon içinden hatayı nasıl bulabilir yada tahmin edebiliriz?

biraz hata almanız güzel de biz o biraz hatayı görmeden her ihtimali buraya yazalım mı? Belki biri tutar diye.

Aklımdan bir sayı tuttum hadi bulun bakalıma dönmesin bu iş…

Dahası da var amacınızı anlarsak alternatif yöntemlerde sunulabilir.

Bir veri tabanınından kaydı okuyup öbürüne tekrar kaydetmek yerine neden işletim sisteminizin copy komutu ile bir kopyasını oluşturmuyorsunuz?

Zaten bir veritabanının aynısını başka bir isimle kaydedecekseniz, verileri kayıt olarak okumak yerine dosyanın kopyasını oluşturmak da alternatif bir çözüm olabilir.

Önerilerimizin hiç biri işe yaramayacak çünkü, amacınız net değil, hata nedir net değil, veri tabanı nerede net değil, hangi kodla kopyalamaya çalıştığınız net değil bunca bulanıklık arasında hep beraber tahmin oyunu oynamamızı mı istiyorsunuz?

Mesela ;

How to copy data from one SQLite database to another (educative.io)

Şunu denedim şöyle bir hata aldım deseniz…

Yada;

Copy tables structure and data from one sqlite database file to another · GitHub

Şunu denedim ama şurasında şöyle bir sorun yaşadım deseniz çok mu zor olurdu?

Bakın iki satırı doldurmayan sorunuz için kaç satır yazı yazmak zorunda kaldım. Sizce bunu hakedecek ne yaptık biz? Size yardım etmek istememiz dışında bu eziyeti neden bize reva görüyorsunuz?

1 Beğeni

İnternetten baktım biraz, hata aldım internetteki kodlarda manasında söylemiştim.

Lokal bir veri tabanı herhangi bir erişim problemi yaşamıyorum.
En son tek tek okuyup yeni değil içinde başka veriler de bulunan olan veri tabanına ekleyerek çözdüm ama tek tek okumaktan ziyade kopyala yapıştır gibi yapılabilir diye düşünmüştüm.

Kayıt yapıları aynı hata ondan kaynaklandığını sanmıyorum.

Haklısınız tahmin edemezsiniz

Bir datayı kopyalayıp içinde başka veriler olan bir dataya yapıştıracağım ilk veriler kalacak bu yapıştırdığım datada.

Buradakini denemiştim ama hata almıştım ne hatası kod neydi hatırlamıyorum üstünden 5 ay geçmiş sonuçta ama ben yine çalıştıramadım buradaki kodu nasıl çalıştırabilirim?

Bu bahsettiğimiz link kod değil, bu sql3 komut istemcisi üzerinden komutlar. Bunları python içinde, system çağrısı olarak komut yürüterek yapabileceğiniz gibi, python arayüzü üzerinden ayrıca kodlamak çözüm olacaktır.

Yani bu haliyle zaten kod olmadığından nasıl kod hatası aldığınızı tahmin edemedim.

Biraz daha açar mısınız?

Bunun Türkçe meali, birinci dosyamdaki verileri, ikinci veritabanımdaki kayıtların devamına ekleyeceğim demek oluyor galiba.

Yine de bilemeyiz. Birinci ve ikinci veri tabanları varolan veri tabanları, kayıt eklemek için açtığınız ikinci veritabanının birinciden faklı olma ihtimalini elemek için oluşturulmasına dair kodu görmek gerekebiiir. İkinci veri tabanına append edeceğiniz veriler için de nasıl bir kod kullandığınızı bilemiyorum onu da görmekte fayda var.

İmlec.execute un içine yazmıştım kodları öyle çalıştırmıştım.

Evet doğru.

Kodu çok önce yazdıydım dediğim gibi bulamadım.

Şöyle de bir yol var:

ChatGpt biraz beceriksiz benim sorunlarımı genelde çözemiyor. Üç gün yazışıp anlaşamadığımız çok oldu kendisiyle ama şanslı günündesin:

Sordum, oda cevap verdi;

Kodu ard arda çalıştırdım ve bir hata almadım. Ama eklediğini nasıl kontrol edeceğiz?

Bir daha şansımı deneyip bir soru daha sordum:

Ona da cevap verdi:

İlk kodu ard arda üç kez çalıştırdığım için ilk veritabanının üçüncü seferde ikinci veritabanına üç kez eklenmesini bekledim;

Ve ikinci kodu çalıştırdım.

Böylece ilk liste db1, ikinci liste db2 tek tek saydım, ilk listede 20 kayıt var, ikinci listede 60 kayıt var eve ikinci veritabanı yoksa oluşturuyor, üç kez çalıştırınca da 60 tane kayıt ekliyor.

Hayret chatgpt ilk seferde her iki soruma da kabul edilebilir derece kod üretip cevaplayabildi.

Tabi hala kafası az basıyor, yan yana dedim alt alta listedeledi ama sonuçta yapay zeka, motomot düz mantık çok da bir şey beklememek lazım.

Bir birimize kod vermemeye yeminli olduğumuzdan kodları buraya alıntılayarak bıraktım. Bir birimize kod yazma nezaketimiz oluştuğunda metin olarka da ekleyebiliriz.

Yine de resimler okunabilir nitelikte gibi.

Kolay gelsin.

Bu kod data 1 i data 2 ye kopyalamıyo mu ekleme yapan bi yer görmedim ben nerede ekleme yapıyor? Data2 yi siliyo her seferinde sonra data 1 in kopyasını data2 olarak kaydediyo?

İşte ben de sizin hata kodunuzu ve ne kod yazdığınızı göremiyorum. Sorun da bu? Normalde bu şekilde soru sorunca haliye biz de çözemiyoruz.

Ama yine de size yardımcı olabilecek farklı bir kod çalıştırdım chatgpt ye biraz kıt akıllı ama kavga dövüş anlaştık.

import sqlite3
import random
import tkinter as tk

# Veri tabanını oluşturma ve kayıt ekleme
def create_and_insert_data1():
    # Veritabanı bağlantısını oluşturma veya var olanı kullanma
    conn1 = sqlite3.connect('data1.db')
    cursor1 = conn1.cursor()

    # Tabloyu oluşturma
    cursor1.execute('''CREATE TABLE IF NOT EXISTS veriler
                    (ad TEXT, soyad TEXT, yas INTEGER)''')

    # Kayıtları temizleme
    cursor1.execute("DELETE FROM veriler")

    # Rastgele 20 kaydı ekleme
    for _ in range(20):
        ad = random.choice(['Ali', 'Ayşe', 'Mehmet', 'Zeynep'])
        soyad = random.choice(['Yılmaz', 'Kaya', 'Demir', 'Can'])
        yas = random.randint(18, 60)
        cursor1.execute("INSERT INTO veriler VALUES (?, ?, ?)", (ad, soyad, yas))

    # Değişiklikleri kaydetme
    conn1.commit()
    conn1.close()

    # İlk veritabanı kayıtlarını listeye ekleme
    conn1 = sqlite3.connect('data1.db')
    cursor1 = conn1.cursor()
    cursor1.execute("SELECT * FROM veriler")
    data1 = cursor1.fetchall()
    conn1.close()

    listbox1.delete(0, tk.END)
    for row in data1:
        listbox1.insert(tk.END, f"Ad: {row[0]}, Soyad: {row[1]}, Yaş: {row[2]}")

    # İlk kayıt sayısını güncelleme
    record_count1.set(f"Toplam Kayıt Sayısı (data1.db): {len(data1)}")


def create_and_insert_data2():
    # İkinci veritabanını oluşturma veya var olanı kullanma
    conn2 = sqlite3.connect('data2.db')
    cursor2 = conn2.cursor()

    # Tabloyu oluşturma
    cursor2.execute('''CREATE TABLE IF NOT EXISTS veriler
                    (ad TEXT, soyad TEXT, yas INTEGER)''')

    # İlk veritabanındaki kayıtları alıp ikinci veritabanına ekleme
    conn1 = sqlite3.connect('data1.db')
    cursor1 = conn1.cursor()
    cursor1.execute("SELECT * FROM veriler")
    data1 = cursor1.fetchall()
    conn1.close()

    cursor2.executemany("INSERT INTO veriler VALUES (?, ?, ?)", data1)
    conn2.commit()
    conn2.close()

    # İkinci veritabanı kayıtlarını listeye ekleme
    conn2 = sqlite3.connect('data2.db')
    cursor2 = conn2.cursor()
    cursor2.execute("SELECT * FROM veriler")
    data2 = cursor2.fetchall()
    conn2.close()

    listbox2.delete(0, tk.END)
    for row in data2:
        listbox2.insert(tk.END, f"Ad: {row[0]}, Soyad: {row[1]}, Yaş: {row[2]}")

    # İkinci kayıt sayısını güncelleme
    record_count2.set(f"Toplam Kayıt Sayısı (data2.db): {len(data2)}")


# Tkinter penceresini oluşturma
window = tk.Tk()
window.title("Veri Tabanı Verileri")
window.geometry("600x600")

# İlk kayıt sayılarını tutmak için değişkenler
record_count1 = tk.StringVar()
record_count2 = tk.StringVar()

# İlk kayıt sayılarını güncelleme
record_count1.set("Toplam Kayıt Sayısı (data1.db): 0")
record_count2.set("Toplam Kayıt Sayısı (data2.db): 0")

# İlk veritabanı listesini oluşturma
label1 = tk.Label(window, text="data1.db Veri Tabanı", font=("Arial", 12))
label1.pack()

listbox1 = tk.Listbox(window, width=50, height=10)
listbox1.pack()

# İkinci veritabanı listesini oluşturma
label2 = tk.Label(window, text="data2.db Veri Tabanı", font=("Arial", 12))
label2.pack()

listbox2 = tk.Listbox(window, width=50, height=10)
listbox2.pack()

# Kayıt sayılarını gösterme etiketlerini oluşturma
label_count1 = tk.Label(window, textvariable=record_count1, font=("Arial", 12))
label_count1.pack()

label_count2 = tk.Label(window, textvariable=record_count2, font=("Arial", 12))
label_count2.pack()

# Veri tabanını güncelleme butonlarını oluşturma ve tıklama olaylarını belirleme
button_create_insert1 = tk.Button(window, text="1. Veri Tabanını Oluştur ve Ekle", command=create_and_insert_data1)
button_create_insert1.pack()

button_create_insert2 = tk.Button(window, text="2. Veri Tabanını Oluştur ve Ekle", command=create_and_insert_data2)
button_create_insert2.pack()

# Pencereyi gösterme
window.mainloop()

Size iki veri tabanı oluşturuyor. 1. veri tabanına ait butona her bastığınızda 1. lisede sadece 20 yeni kayıt oluşturuyor eskileri siliyor. Yani ilk veri tabanınız sizin kaynak veritabanınız her seferinde size 20 yeni eklenecek veri oluşturan temsili bir veritabanı.

İkinci butona her bastığınızda hedef (2. veritabanınız.) veritabanıza kaynak veri tabanında bulunan 20 kaydı ekliyor.

Bu nedenle her seferinde kayıt sayınız artacaktır buradan eklendiğini anlayabilirsiniz.

Burada ilk listede 20 lik kayıtlar generate ettik. 2. ye ekledik, sonra 20 lik başka bir liste generate ettik ve 2. veri tabanına ekledik. Ben bir kaç kez yaptığımda 220 kayıt oluştu. Yani 20 şer yirmişer ilk veri tabanında ne varsa ikinciye ekliyor.

Ufak bir sorunu var ikinci listeyi güncellemiyor o da çözülebilir bir problem, malum chatgpt tek tek anlatmak gerekiyor kendisine.

Ama siz zaten veri tabanlarınıza kendiniz erişip sorgulayacağınız için listeleme kısmına takılmadım.

Yada ben biraz daha chatgpt ye hendek atlatayım:

import sqlite3
import random
import tkinter as tk

# Veritabanı bağlantıları
conn1 = sqlite3.connect("data1.db")
conn2 = sqlite3.connect("data2.db")
cursor1 = conn1.cursor()
cursor2 = conn2.cursor()

# Veri tabanını oluşturma ve kayıt ekleme
def create_and_insert_data1():
    cursor1.execute("DROP TABLE IF EXISTS veriler1")
    cursor1.execute("CREATE TABLE IF NOT EXISTS veriler1 (ad TEXT, soyad TEXT, yas INTEGER)")

    data1 = generate_random_data(20)
    cursor1.executemany("INSERT INTO veriler1 VALUES (?, ?, ?)", data1)
    conn1.commit()

    update_listbox1(data1)
    update_record_count1()

def create_and_insert_data2():
    cursor2.execute("CREATE TABLE IF NOT EXISTS veriler2 (ad TEXT, soyad TEXT, yas INTEGER)")

    cursor1.execute("SELECT * FROM veriler1")
    data1 = cursor1.fetchall()

    cursor2.executemany("INSERT INTO veriler2 VALUES (?, ?, ?)", data1)
    conn2.commit()

    update_listbox2(data1)
    update_record_count2()

# Rastgele veri oluşturma
def generate_random_data(count):
    data = []
    for _ in range(count):
        ad = random.choice(["Ali", "Ayşe", "Mehmet", "Zeynep", "Ahmet"])
        soyad = random.choice(["Yılmaz", "Kaya", "Demir", "Şahin", "Yıldırım"])
        yas = random.randint(18, 60)
        data.append((ad, soyad, yas))
    return data

# İlk veritabanı listesini güncelleme
def update_listbox1(data):
    listbox1.delete(0, tk.END)
    for row in data:
        listbox1.insert(tk.END, f"{row[0]} {row[1]} - {row[2]}")

# İkinci veritabanı listesini güncelleme
def update_listbox2(data):
    listbox2.delete(0, tk.END)
    for row in data:
        listbox2.insert(tk.END, f"{row[0]} {row[1]} - {row[2]}")

# İlk veritabanı kayıt sayısını güncelleme
def update_record_count1():
    cursor1.execute("SELECT COUNT(*) FROM veriler1")
    count = cursor1.fetchone()[0]
    record_count1.set(f"Kayıt Sayısı: {count}")

# İkinci veritabanı kayıt sayısını güncelleme
def update_record_count2():
    cursor2.execute("SELECT COUNT(*) FROM veriler2")
    count = cursor2.fetchone()[0]
    record_count2.set(f"Kayıt Sayısı: {count}")

# Tkinter penceresini oluşturma
window = tk.Tk()
window.title("Veri Tabanı Verileri")
window.geometry("800x400")

# İlk veritabanı listesini oluşturma
label1 = tk.Label(window, text="data1.db Veri Tabanı", font=("Arial", 14, "bold"))
label1.grid(row=0, column=0, padx=10, pady=10)

listbox1 = tk.Listbox(window, width=40)
listbox1.grid(row=1, column=0, padx=10)

# İkinci veritabanı listesini oluşturma
label2 = tk.Label(window, text="data2.db Veri Tabanı", font=("Arial", 14, "bold"))
label2.grid(row=0, column=1, padx=10, pady=10)

listbox2 = tk.Listbox(window, width=40)
listbox2.grid(row=1, column=1, padx=10)

# Kayıt sayılarını tutmak için değişkenler
record_count1 = tk.StringVar()
record_count2 = tk.StringVar()

record_count1.set("Kayıt Sayısı: 0")
record_count2.set("Kayıt Sayısı: 0")

label_count1 = tk.Label(window, textvariable=record_count1, font=("Arial", 12))
label_count1.grid(row=2, column=0, pady=10)

label_count2 = tk.Label(window, textvariable=record_count2, font=("Arial", 12))
label_count2.grid(row=2, column=1, pady=10)

# Veri tabanlarını oluşturma ve kayıt ekleme düğmeleri
button_create_insert1 = tk.Button(window, text="data1.db Veritabanını Yeniden Oluştur ve Kayıt Ekle", command=create_and_insert_data1)
button_create_insert1.grid(row=3, column=0, pady=10)

button_create_insert2 = tk.Button(window, text="data2.db Veritabanına Kayıtları Ekle", command=create_and_insert_data2)
button_create_insert2.grid(row=3, column=1, pady=10)

# Pencereyi gösterme
window.mainloop()

Şimidi biraz daha geliştirebildi kodu.

  1. liste 20 rasgele ve her seferinde yeniden oluşturuluyor.

  2. liste 1. listedeki 20 rasgele veriyi ikinci veritabanına ekliyor.

İkinci liste ye veriler eklenince kayıt sayıları görülüyor.

İçinde istediğiniz özel bir arama vs sorgu varsa çekinmeyin sorun ben chatgpt ye kavga dövüş bir şekilde yaptırırım.

Kolay gelsin.

Bu kadar havada olan bir konuyla bu kadar ilgilendiğiniz için teşekkür ederim tam düşündüğüm şekilde olmasa da executemany aynı işlemi yapıyormuş yeni öğrendim.