ホームページ  >  記事  >  バックエンド開発  >  Flask-SQLAlchemy と Alembic: Python Web アプリケーションでデータベースを移行するためのベスト プラクティス (パート 2)

Flask-SQLAlchemy と Alembic: Python Web アプリケーションでデータベースを移行するためのベスト プラクティス (パート 2)

PHPz
PHPzオリジナル
2023-06-17 20:34:381269ブラウズ

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 - https://flask-sqlalchemy.palletsprojects.com/
  • Alembic - https://alembic.sqlalchemy. org/en/最新/

以上がFlask-SQLAlchemy と Alembic: Python Web アプリケーションでデータベースを移行するためのベスト プラクティス (パート 2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。