Ali GOREN

Open Source, JavaScript, Python, .NET

Flask-Migrate ile Database Migrationlarını Gerçekleştirmek

| Permalink

Herkese selamlaar 🙂

Laravel olsun, express olsun, adonis olsun birçok frameworkte bu migration işlemleri zaten var. Hatta .NET MVC ile entity framework kullananlar da migration işlemlerini biliyorlar.

Üst Bölüm Düzenlemesi:

Sevgili Bahadır Yardım bir konuda düzeltme yaptı. Kendisine çok teşekkür ederim. İlgili Düzenleme nedeniyle hatalı yazdığım bölümün üstünü çizdim.

Bu bence yanlış olmuş .NET Framework tarafında Entity Framework çok güçlü bir ORM ve istediğiniz bir yaklaşımı(CodeFirst,DBFirst) seçerek kolayca migrate işlemi yapılabiliyor. Yani demek istediğim aslında her ORM’de olmasa bile birçok ORM migration yapısını desteklemektedir o yüzden aslında ORM ile uğraşan bir kişi muhtemelki Migration yapısını bilir diye düşünüyorum.

Kendisine teşekkürlerimi sunuyorum tekrardan.

Napar Bu Migration Yaklaşımı

Kısacası, code first yaklaşımlarında classlar ya da ilgili dilin özelliği ne ise o kullanılarak fieldlara erişilir ve bu fieldlardan database alanları oluşturulur.

Tabii bu aşamada standart olarak create all yaklaşımı daima önce eski database’i siler ve sonradan sıfırdan oluşturur. Bu tahmin edebileceğiniz üzere canlıda istemeyeceğimiz bir şey. Örnek verelim;

Kullanıcılara dair veri tutan bir tablo var. Bu tabloda belli alanlar var ve veriler almış. Ardından müşteriniz yeni bir feature ile kapınızı çaldı. Diyor ki bu müşterinin şu verisi de olsun. Örneğin ayak numarasını tutan saçma bir sistem.

Database Sıfırlanıyo Abi Napcaz?

Modelinizi kullanarak create_all yaptığınızda bu alanı ekletebildiniz fakat database sıfırlandı. Haydaa ne olacak şimdi?

Bana Bi Aydınlanma Geliyo 😛

Heh bu problemi yaşamamak için migration toollar çıkmış. O dilin olanağı şeklinde var bunlar. Çünkü bazı uygulamalar farklı app contextler üzerinde run edilebiliyor. Farklı configlerde bu migration çalışmasına kadar giden süreçler var.

Bu migration toollar kullanarak sadece model üzerinde değişiklik yaptığınız database field’ının özelliklerini değiştirirsiniz.

Benim Flask tarafında işimi çözen ise Flask-Migrate oldu.

Dolphin IT adında bir side project çıkarıyorum evde. GitHub’da beni stalklayanlarınız varsa görmüştür.

Hadi kuralım

source env/bin/activate

pip install flask-migrate

Kurduk şimdi napcaz? Benim uygulamada application factory yaklaşımı kullanıldığı için bu kütüphaneyi de öyle kullanacağız.

app/init.py

Önce bu flask-migrate’i import edelim.

from flask_migrate import Migrate

Sonra Migrate’in instance’ını alacağız.

migrate = Migrate()

Sonra factory method içerisine gidelim ve şöyle bir ekleme yapalım

db.init_app(app)
migrate.init_app(app, db)

Evet bu kadar şimdi bunu nasıl kullanacağız? Kısacası o da şöyle

export FLASK_APP=app.py
export FLASK_ENV=development

flask db init

Burada init komutunu sürekli vermenize gerek yok. Bu komutla migrations klasörü oluşuyor. Zaten varsa bir daha oluşturmayacak ve Error üretecektir. Ardından migrate ve upgrade yapacağız.

Öncelikle migrate;

flask db migrate

Sonra upgrade

flask db upgrade

Bu 2 komut database modelinizde güncelleme yaptığınızda çalıştırmanız gereken komutlar oluyor sadece.

Örnek projeye şuradan gidebilirsiniz:

https://github.com/aligoren/dolphin-it

Okuduğunuz için teşekkür ederim. Umarım faydalı olmuştur. Hatalı ya da eksik gördüğünüz bir şey var ise belirtirseniz düzeltirim 😛

Kaynaklar