flask migrate upgrade не работает после выпадающей таблицы

Я использую 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 #, который фактически выполняет миграции и создает таблицы 'users' и 'posts' в db.

Теперь я запускаю свой 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", "[email protected]", "admin"))
        db.session.commit()

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

Теперь tearDown () удаляет все таблицы в базе данных после завершения работы test.py.

После этого, когда я бегу

Обновление базы данных python manage.py

он дает мне следующие сообщения на консоли:

ИНФОРМАЦИЯ [alembic.runtime.migration] Контекст использует MySQLImpl.
ИНФОРМАЦИЯ [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

запускался сам в первый раз? 2 сценария миграции, созданные db migrate, на самом деле не сильно отличаются, или они? Итак, почему само обновление не сработает в первый раз (когда у обновления действительно есть код, который создает таблицы) и почему он будет работать отлично, когда новый скрипт сгенерирован снова (где сам метод обновления вообще не изменился, так как по сравнению с предыдущим скриптом миграции?


person qre0ct    schedule 25.10.2016    source источник


Ответы (1)


drop_tables отбрасывает только те таблицы, о которых он знает. Alembic добавляет свою собственную таблицу alembic_version, чтобы отслеживать, на каком этапе миграции находится база данных. Поскольку эта таблица не удаляется drop_tables, Alembic по-прежнему видит ее со значением, установленным после выполнения обновлений. Вместо этого выполните команду downgrade, чтобы вернуться в исходное пустое состояние. .

from flask_migrate import downgrade

downgrade(revision='base')

Однако вам не следует переходить на более раннюю версию только для запуска тестов, вы должны использовать отдельную базу данных, чтобы не связываться с данными разработки или производства.

person davidism    schedule 25.10.2016