次に、flask db migrate を実行し、マイグレーション用のスクリプトを生成します。
マイグレーションには automatic と manual の 2 種類があり、automatic の場合、Python 上でモデルに定義された形と、実際の DB のスキーマを Alembic が比較して、必要な差分を埋めるスクリプトを生成します。今回の場合、元のデータベースが存在しないので、データベース自体と User テーブルを生成するスクリプトが作成されます。
$ flask db migrate
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'user'
INFO [alembic.autogenerate.compare] Detected added index 'ix_user_email' on '['email']'
INFO [alembic.autogenerate.compare] Detected added index 'ix_user_username' on '['username']'
INFO [alembic.autogenerate.compare] Detected removed table 'User'
Generating /home/dejima/hakky/pig-eye-api-old/flask_db_test/migrations/versions/befa50e57033_.py ... done
# befa50e57033_.py
"""empty message
Revision ID: befaxxxx33
Revises:
Create Date: xxxx-xx-xx xx:xx:xxxxx
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'befa******'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('user',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('username', sa.String(length=64), nullable=True),
sa.Column('email', sa.String(length=120), nullable=True),
sa.Column('password_hash', sa.String(length=128), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True)
op.create_index(op.f('ix_user_username'), 'user', ['username'], unique=True)
op.drop_table('User')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('User',
sa.Column('id', sa.TEXT(), nullable=True),
sa.Column('username', sa.TEXT(), nullable=True),
sa.Column('email', sa.TEXT(), nullable=True),
sa.Column('password_hash', sa.TEXT(), nullable=True)
)
op.drop_index(op.f('ix_user_username'), table_name='user')
op.drop_index(op.f('ix_user_email'), table_name='user')
op.drop_table('user')
# ### end Alembic commands ###
履歴は以下のように、flask db history コマンドで確認できます。
$ flask db history
<base> -> befa50e57033 (head), empty message
マイグレーションの実行
最後に、flask db upgrade コマンドを実行して、upgrade の内容(Userテーブル作成)を実行します。
$ flask db upgrade
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> befa50e57033, empty message
def upgrade():
- pass
+ op.execute("ALTER TABLE User RENAME INDEX author_id to user_id")
def downgrade():
- pass
+ op.execute("ALTER TABLE User RENAME INDEX user_id to author_id")