在drop table

时间:2016-10-25 18:40:51

标签: flask sqlalchemy flask-sqlalchemy alembic flask-migrate

我正在使用SqlAlchemy和Flask-migrate进行数据库迁移。我已成功启动数据库并使用以下内容升级一次:

  

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#实际进行迁移并创建'用户'以及'帖子'数据库中的表格。

现在我运行我的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()会删除数据库中的所有表。

此后,现在我跑

  

python manage.py db upgrade

它在控制台上给我以下消息:

  

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 db upgrade

再次创建表格。

现在我想了解为什么在

时没有创建表格
  

python manage.py db upgrade

第一次运行了吗? db migrate创建的2个迁移脚本实际上并没有太大差异,或者它们是什么?那么,为什么第一次本身就会升级升级工作(当升级实际上有创建表的代码时)以及为什么在再次生成新脚本时(升级方法本身在所有与之前的迁移脚本相比?

1 个答案:

答案 0 :(得分:2)

drop_tables只删除它知道的表格。 Alembic添加了自己的表alembic_version,以跟踪数据库的迁移。由于该表未被drop_tables删除,因此Alembic仍然会在运行升级后看到它所设置的值。请运行downgrade命令以返回空的初始状态。

from flask_migrate import downgrade

downgrade(revision='base')

但是,您不应仅仅为了运行测试而降级,您应该使用单独的数据库,以免混淆开发或生产数据。