Django ile veritabanları arasında veri aktarma (sqlite to mysql migration)

Django ile başladığım projede veritabanını değiştirme aşamasına geldiğim zaman sqlite veritabanına bir çok veri girildiğini ve bunlarında aktarılması gerektiğini fark ettim. İnternette bir çok uygulama ile bu yapılabilir. Fakat ben bunu django ile yapmayı tercih ettim.

Sqlite veritabanından mysql veritabanına çevirme sürecinde ki deneyimlerimi adım adım aktarmak istiyorum.

İlk olarak sqlite veritabanı yapımızı mysqle aktarmak lazım. Bu süreçten önce ben yeni tablo ve sütun açma işlemlerinde django migrate işlemini kullanmıştım. Ondan dolayı kolay oldu.

Django ile mysql bağlantısı için pymysql kütüphanesini kullandım.

pip3 install pymysql 

komutu ile yükledim sonrasında settings.py içerisi

import pymysql
pymysql.install_as_MySQLdb()

satırını ekleyerek bağlantı için ilk aşamayı tamamladık. Bu arada pymysql kütüphanesi python ile yazıldığından dolayı biraz daha yavaş çalışıyor fakat MacOsX’te diğer kütüphanelerin derlenmesi sorunlu olduğundan bunu tercih ettim.

DATABASES = {
    'old': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },

    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'localhost',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',  # Or an IP Address that your DB is hosted on
        'PORT': '3306'
    }
}

databases parametresini üstte ki gibi yaptım. Komut satırından

python3 manage.py migrate

otomatik olarak mysql veritabanını düzenledi.

Mysql veritabanına kayıtlar atılmadan önce veritabanında ki foreign key’leri silmemiz lazım. Bunun nedeni sqlite veritabanında ki verilerin aktarılması sırasında hata oluşacağı için.

SELECT CONCAT(‘ALTER TABLE ‘, TABLE_NAME, ‘ DROP FOREIGN KEY ‘, CONSTRAINT_NAME, ‘;’)
FROM information_schema.key_column_usage
WHERE CONSTRAINT_SCHEMA = ‘DB’
AND TABLE_NAME IN (‘GEREKLI_OLAN_TABLOLAR’)
AND REFERENCED_TABLE_NAME IS NOT NULL;

komutu sonucunda oluşan satırları çalıştırınca bütün foreign key’ler silinecektir.

Şu ana kadar ki bütün aşamalar mutfakta ki hazırlık aşamasıydı. Son aşama olarak verileri aktarma kaldı.

def export(table_name):
    if table_name is not None:
        datas = table_name.objects.using('old').all()
        for item in datas:
            item.save(using="default")
export(CustomerEntity)
export(ExceptionEntity)
export(ProductEntity)
export(ProductTagEntity)
export(UserEntity)

komutlarını django projesinin içerisinde çalıştırdığınızda sqlite verilerinizi mysql’e aktaracaktır.

Üst kısımda anlatmış olduğum aşamayı diğer veritabanları arasında aktarımda da kullanabilirsiniz. Benim sorunumda aktarım sqlite ile mysql arasında olacağından ona göre anlattım.

Umarım faydalı olmuştur.

Facebook Comments

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir