Flask-Migrate ile Veritabanı Geçiş Yönetimi

Flask ve SQLAchemy ile geliştirilen projelerde, veritabanına ait model dediğimiz sınıfları hazırladıktan sonra create_all() diyerek veritabanını anında oluşturabiliyoruz. Proje henüz geliştirme aşamasındayken sorun teşkil etmeyen bu yöntem ile, daha önceki bütün tablolar ve veriler silinecek, ayrıca tablolar yeniden oluşturulacaktır. Peki ya aktif çalışan bir uygulamada bu işlemler nasıl olacak?

Flask-Migrate ile Geçiş Yönetimi

Dediğimiz gibi, create_all() yöntemi bütün veritabanını silip yeniden oluşturuyor. Ve maalesef üzerinde canlı verilerin bulunduğu production ortamında bu pek mantıklı bir hareket değil. Bu durumun eksikliğini fark eden bazı geliştiriciler Flask-Migrate paketini geliştirmiş. Böylece canlı verilere zarar vermeden veritabanı üzerinde değişiklik yapmak mümkün oldu. Ayrıca veritabanı üzerindeki değişiklikler de kaydedilir hale geldi.

Hemen paketi yükleyelim ve paketi uygulamamıza tanıtalım.

~$ pip install flask-migrate

flask-migrate paketini yükledik.

Artık projemize paketi tanıtabiliriz. Projenin çalışma dosyası veya fonksiyonuna aşağıdaki eklemeyi gerçekleştirelim (Genelde bu dosya app.py olur):

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

Not: İkinci satırdaki db değişkeninin SQLAchemy ile oluşturduğumuz bir örnek(instance) olduğuna dikkat edelim.

Flask-Migrate paketini artık projemize dahil ettik. Şimdi veritabanı geçiş(migration) işlemlerine geçebiliriz. Öncelikle geçiş işlemlerinin takip edileceği klasörü oluşturalım.

~$ flask db init

Geçiş(Migration) İşlemlerinin kaydedileceği klasör oluşturuldu

Bu komut, proje klasörümüze geçiş dosyalarını oluşturacaktır. Komutun bir defa verilmesi yeterlidir. Şimdi veritabanımızın şu anki kopyasını alalım bakalım.

~$ flask db migrate

Değişiklikler Hafızaya Alındı

Bu komut ilk kez kullanıldığında, o anki bütün modellerimizi kaydedecek ve bir sürüm numarası oluşturacaktır. Sonraki kullanımlarda ise bir önceki sürümü kontrol ederek sadece mevcut değişiklikleri hafızasına alacaktır.

Not: Kötü haber; Maalesef bu karşılaştırmaları yapan Alembic kütüphanesi (Flask-Migrate kullanıyor) sütun değişikliklerini algılamıyor, bunu elle girmeniz gerekmektedir.

Eğer bu işlem tamamsa artık değişiklikleri veritabanımıza uygulayabiliriz.

~$ flask db upgrade

değişiklikler veritabanına uygulandı

Böylece sadece iki komut yazarak projeyi bozmadan ve yıkmadan tablolarda değişiklik yapabildik.

Versiyonlara Not Eklemek

Tıpkı git üzerinde olduğu gibi değişikliklere not ekleyebiliyorsunuz.

~$ flask db migrate -m “yeni bir field eklendi”

Yapılan Değişiklikleri Geri Almak

Veritabanını bir önceki haline döndürmek istiyorsanız (rollback) downgrade komutunu yazmanız yeterli olacaktır.

~$ flask db downgrade

Veritabanı üzerindeki değişiklikler geri alındı

Hepsi bu kadar! Tabii ki daha detaylı bilgi edinmek için Flask-Migrate dokümantasyonunu inceleyebilirsiniz.

Ayrıca daha önceden test verisi yüklemek için hazırladığımız makaleye de aşağıdaki bağlantıdan göz atabilirsiniz.

Kolay gelsin!

Leave a comment