Я использую 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, на самом деле не сильно отличаются, или они? Итак, почему само обновление не сработает в первый раз (когда у обновления действительно есть код, который создает таблицы) и почему он будет работать отлично, когда новый скрипт сгенерирован снова (где сам метод обновления вообще не изменился, так как по сравнению с предыдущим скриптом миграции?