Flask-SQLAlchemy と Alembic: Python Web アプリケーションでデータベースを移行するためのベスト プラクティス (パート 2)
前の記事では、Flask-SQLAlchemy と Alembic がどのように連携するかについて説明しました。この記事では主に、いくつかの基本的なデータ モデルで列を追加および削除し、一部の列の型や制約を変更する方法を紹介します。これらの変更は、実際のプロジェクト開発中に非常に一般的です。
列の追加と削除
Flask-SQLAlchemy と Alembic をデータベース移行に使用する場合、テーブル列の追加と削除は非常に一般的です。このプロセスを示すために、次のサンプル パーソン モデルにいくつかの新しい列を追加します。
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Person(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), nullable=False) age = db.Column(db.Integer) def __repr__(self): return '<Person %r>' % self.name
2 つの新しい列を追加するとします。1 つは生年月日 (birthdate) で、もう 1 つは結婚しているかどうかを示すブール列 (is_married) です。次のコマンドを使用して移行スクリプトを生成できます:
$ alembic revision -m "add birthdate, is_married columns to person"
次に、生成された .py 移行スクリプト ファイルを変更して新しい列を追加する必要があります。 upgrade() 関数で add_column() を使用できます。
from alembic import op import sqlalchemy as sa def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.add_column('person', sa.Column('birthdate', sa.Date(), nullable=True)) op.add_column('person', sa.Column('is_married', sa.Boolean(), nullable=True)) # ### end Alembic commands ###
列を削除するには、対応するデストラクター degrade() でdrop_column() 関数を使用して、データベース モデルから列を削除します。
def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_column('person', 'birthdate') op.drop_column('person', 'is_married') # ### end Alembic commands ###
この移行スクリプトの完全なサンプル コードは以下にあります。
"""add birthdate, is_married columns to person""" from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision = 'eab2c4f1c9fb' down_revision = '7cfae59c2402' branch_labels = None depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.add_column('person', sa.Column('birthdate', sa.Date(), nullable=True)) op.add_column('person', sa.Column('is_married', sa.Boolean(), nullable=True)) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_column('person', 'birthdate') op.drop_column('person', 'is_married') # ### end Alembic commands ###
列タイプの変更と制約の変更
多くの場合、列タイプと制約を変更する必要があります。人物モデルの年齢列の型を INTEGER から SMALLINT に変更するとします。これを実現するには、生成された .py 移行スクリプト ファイルで alter_column() 関数を使用します。
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.alter_column('person', 'age', existing_type=sa.Integer(), type_=sa.SmallInteger(), nullable=True) # ### end Alembic commands ###
列の制約を変更することもできます。人物モデルを調べると、モデル内に一意の値の制約がないことがわかります。次のコードを使用して、名前と生年月日の列に一意の値の制約を追加できます。
from alembic import op import sqlalchemy as sa def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_unique_constraint(op.f('uq_person_name'), 'person', ['name']) op.create_unique_constraint(op.f('uq_person_birthdate'), 'person', ['birthdate']) # ### end Alembic commands ###
後で一意の値の制約をキャンセルする必要がある場合は、drop_constraint() 関数を使用できます。例:
def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_constraint(op.f('uq_person_name'), 'person', type_='unique') op.drop_constraint(op.f('uq_person_birthdate'), 'person', type_='unique') # ### end Alembic commands ###
この記事では、列の追加と削除、列制約の変更、列のデータ型の変更など、一般的なタイプのデータベース スキーマ変更をいくつか紹介します。 Flask-SQLAlchemy と Alembic を使用したデータベース移行のベスト プラクティスを示します。これにより、データベース スキーマをより効率的に管理し、チーム環境で移行ファイルをより簡単に共有できるようになります。
参考リンク:
以上がFlask-SQLAlchemy と Alembic: Python Web アプリケーションでデータベースを移行するためのベスト プラクティス (パート 2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。