2

DB移行にはSqlAlchemyとFlask-migrateを使用しています。DB の初期化に成功し、以下を使用して 1 回アップグレードしました。

python manage.py db init
python manage.py db migrate # 以下のように移行スクリプト faefc6a6c7ae を作成します。

"""empty message

Revision ID: faefc6a6c7ae
Revises: None
Create Date: 2016-10-25 22:09:25.615569

"""

# revision identifiers, used by Alembic.
revision = 'faefc6a6c7ae'
down_revision = None

from alembic import op
import sqlalchemy as sa


def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('users',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=100), nullable=False),
    sa.Column('email', sa.String(length=100), nullable=False),
    sa.Column('password', sa.String(length=100), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('posts',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('title', sa.String(length=50), nullable=False),
    sa.Column('description', sa.String(length=50), nullable=False),
    sa.Column('author_id', sa.Integer(), nullable=True),
    sa.ForeignKeyConstraint(['author_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('posts')
    op.drop_table('users')
    ### end Alembic commands ###

その後

python manage.py db upgrade # 実際に移行を行い、db に「users」テーブルと「posts」テーブルを作成します。

ここで、次のコード行を含む test.py を実行します (他とは別に):

from flask_testing import TestCase
class BaseTestCase(TestCase):
    def create_app(self):
        app.config.from_object('config.TestConfig')
        return app

    def setUp(self):
        db.create_all()
        db.session.add(BlogPost("Test post", "This is a test. Only a test."))
        db.session.add(User("admin", "ad@min.com", "admin"))
        db.session.commit()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

test.py の実行が終了した後、tearDown() は db 内のすべてのテーブルを削除します。

この後、今私が走るとき

python manage.py データベースのアップグレード

コンソールに次のメッセージが表示されます。

INFO [alembic.runtime.migration] コンテキスト impl MySQLImpl.
INFO [alembic.runtime.migration] 非トランザクション DDL を想定します。

しかし、実際にはそれぞれのテーブルをまったく作成しません。ただし、回避策があります。だから私がするなら:

python manage.py db migrate # 以下のように新しい移行スクリプトを作成します (以前のものとあまり変わらない):

"""empty message

Revision ID: 848398c80589
Revises: faefc6a6c7ae
Create Date: 2016-10-26 00:06:26.468354

"""

# revision identifiers, used by Alembic.
revision = '848398c80589'
down_revision = 'faefc6a6c7ae'

from alembic import op
import sqlalchemy as sa


def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('users',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=100), nullable=False),
    sa.Column('email', sa.String(length=100), nullable=False),
    sa.Column('password', sa.String(length=100), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('posts',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('title', sa.String(length=50), nullable=False),
    sa.Column('description', sa.String(length=50), nullable=False),
    sa.Column('author_id', sa.Integer(), nullable=True),
    sa.ForeignKeyConstraint(['author_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('posts')
    op.drop_table('users')
    ### end Alembic commands ###

そしてもしそうなら

python manage.py データベースのアップグレード

再び、テーブルが作成されます。

ここで、テーブルが作成されなかった理由を理解したいと思います

python manage.py データベースのアップグレード

初めて実行されましたか? db migrate によって作成された 2 つの移行スクリプトは、実際にはそれほど違いはありませんか? では、アップグレード自体が初めて機能しないのはなぜですか (アップグレードに実際にテーブルを作成するコードがある場合)、新しいスクリプトが再度生成されたときに完全に機能するのはなぜですか (アップグレード方法自体がまったく変更されていない場合)。以前の移行スクリプトと比較して?

4

1 に答える 1

2

drop_tables知っているテーブルのみを削除します。Alembic は独自のテーブル を追加してalembic_version、データベースの移行状況を追跡します。そのテーブルは によって削除されないためdrop_tables、Alembic はアップグレードの実行後も設定された値でそれを認識します。代わりにコマンドを実行しdowngradeて、空の初期状態に戻してください。

from flask_migrate import downgrade

downgrade(revision='base')

ただし、テストを実行するためだけにダウングレードするべきではありません。開発データや運用データを台無しにしないように、別のデータベースを使用する必要があります。

于 2016-10-25T19:52:34.600 に答える