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.
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 😛