30-05-2017, Saat: 17:21
Database Migration
Daha önceki konularda tabloları tasarlarken, python programlama dilindeki sınıfları kullandık. Bu sınıflar veritabanınadaki tablolara karşılık gelirler. Bu sınıflar tabloları oluşturmada kullanılır. Diyelim ki bu sınıflarda değişiklik yapıldığında bu değişikliğin veritabanına yapılması sorunu ortaya çıkar. Çünkü tablolar ilk oluşturulduğunda veritabanında bu sınıfların ilk hali yer alır. Database Migration ise veritabanı tablolarına yapılan bu değişikliklerin veritabanına eklenmesi işlemidir. Bu işlem için geliştirilen Database Migration Frameworkler'i vardır. Bu frameworkler sınıflara yapılan bu değişiklikleri tutar ve veritabanına işlenmesini sağlar.
SQLAlchemy geliştiricileri Alembic isminde bir database migration framework geliştirmişler. Flask geliştiricileri Alembic'i kullanarak bir eklenti geliştirmişler bu eklenti ile migrate işlemlerini yapacağız. Bu eklentiyi yüklemek için:
Kod:
$ pip install flask-migrate
$ pip install flask-script
Bu eklentiyi kullanmadan önce, daha önce anlattığım flask-script eklentisi hakkında biraz bilgi vermek istiyorum. flask-script ile uygulamamızı farklı modlarda çalıştırmayı öğrenmiştik(örneğin test modu). Şimdi bir örnek yapalım:
Kod:
#hello.py
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config.update(
SQLALCHEMY_DATABASE_URI = "sqlite:///db.sqlite",
SQLALCHEMY_TRACK_MODIFICATIONS = True
)
db = SQLAlchemy(app)
manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(10), unique=True)
@app.route("/", methods=['GET', 'POST'])
def index():
return render_template('index.html')
if __name__ == '__main__':
manager.run()
Şimdi database migration işlemlerini yapabiliriz. Flask-migrate eklentisinden import ettiğimiz
Kod:
MigrateCommand
sınıfını
Kod:
db
isminde bir komuta bağlıyoruz. Yani bu sınıfın komutlarını kullanmak için db isminde bir komut ekliyoruz, bu komut yazıldığında kullanabileceğimiz komutlar listelenecektir:
$ python hello.py db ... migrate Alias for 'revision --autogenerate' init Creates a new migration repository show Show the revision denoted by the given symbol. upgrade Upgrade to a later version ...
görüldüğü gibi komutların karşısında ne iş yaptıklarıda yazılıyor.
Database migration işlemleri için bir klasör oluşturulur. Bu klasörde tüm migration scriptleri tutulur. Bu klasörü oluşturmak için:
Kod:
$ python hello.py db init
bu işlemden sonra
Kod:
migrations/
isminde bir klasör oluşturulur.
Alembic framework'ü database migration'ı
Kod:
migrate
script ile yönetir. Bu script'e
Kod:
upgrade()
ve
Kod:
downgrade()
isminde iki fonksiyon bulunur.
Kod:
upgrade()
fonksiyonu yeni eklenen işlemleri veritabanına eklenir.
Kod:
downgrade()
fonksiyonu ise bir önceki durumuna getirir.
Alembic migration'larını otomatik oluşturmak için
Kod:
migrate
komutu kullanılır. Bu komut
Kod:
upgrade()
ve
Kod:
downgrade()
fonksiyonları için otomatik olarak kod oluşturur. Bu kodları oluştururken veritabanın o anki durumuna ve model sınıfların durumuna bakarak oluşturur:
Kod:
$ python hello.py db migrate
bu komuttan sonra, upgrade() ve downgrade() fonksiyonları oluşturulmuştur:
Kod:
$ python hello.py db upgrade
bu komut veritabanındaki verileri değiştirmeden en son değişiklikleri veritabanına uygular.