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.

Fazlasını Oku

Django, AngularJS, Ajax

Bir fikir kapsamında Django Web Framework ile geliştirmeye yapmaya başladım. Daha önceden Python ile herhangibir geliştirme yapmadığımdan dolayı öncelikle Python öğrenmem ondan sonrada Django öğrenmem gerekti. Doğruyu söylemek gerekirse ilk başlarda oldukça itici geldi. Ama bir süre kullandıktan sonra hızlı ve kolay geliştirme ortamı ve içerisinde gelen özellikleri hoşuma gitti.

Konu web olunca benim için artık vazgeçilmez olan AngularJS kullanmak isteiğimde bazı sıkıntılar yaşamaya başladım. Öncelikli olarak binding kısımları çalışmıyordu. Ne yaptıysam çalışmadı. Kısa bir araştırma sonucunda html içerisinde veri gösteriminde kullandığım süslü parantezlerin template kısmında binding için kullanıldığını öğrendim. Angular kısmında bu tarz şeyler için bazı ayarlamalar yapılabiliyor.

Daha sonra verileri POST etme aşamasında csrf güvenlik hatası almaya başladım. csrf hatası için template ve AngularJS kısmında düzenlemeler yapmak zorunda kaldım. Tabi bunu decorator(attribute) ilede yapmak mümkün ama bunu yapmak güvenliği bir nebze bile olsa azaltacağından dolayı AngularJS tarafında çözüm bulmak istedim. Bu arada template kısmında {% csrf_token %} komutunu kullanmamız şart.

Son olarak Ajax ile gönderdiğim verileri okumakta sorun yaşadım. Sunucu tarafında gelen istediğin Ajax mı yoksa normal bir istek mi olduğunu request.is_ajax() ile sorguladığım zaman sürekli olarak False yanıtını aldım. Tabi bunun içinde AngularJS kısmında bir çözüm mevcut.

Sonuç olarak henüz projenin başındayım. İlerleyen süreçte daha ne gibi sürprizler ile karşılaşacağımı bilmiyorum ama ilginç olanları burada yazmaya niyetliyim. Bu arada AngularJS kısmında kullandığım düzenlemeler aşağıda mevcut. Umarım sizede bir faydası dokunur.

 

angular.module('ProejectApp', ['ngRoute', 'ngCookies']
.config(['$httpProvider', '$interpolateProvider', function ($httpProvider, $interpolateProvider) {

    /* template içerisinde bind işlemini yapmak için {$ BunuEkranaBas $} */
    $interpolateProvider.startSymbol('{$');
    $interpolateProvider.endSymbol('$}');

    
    /* csrf çerezi için gerekli olan kodumuz */
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
    
    /* Sunucu tarafında Ajax sorgunu tanımlamak ve veriyi okumak için kullandığım kod */
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
    $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
}])

Fazlasını Oku