Я использую alembi c для генерации сценариев миграции базы данных для базы данных mysql. Я заметил, что синтаксис сгенерированных сценариев обновления и понижения немного отличается, тогда как я думал, что они в основном будут одинаковыми.
models.py - до
class Message_User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), nullable=True)
models.py - после модификации таблицы
class Message_User(db.Model):
id = db.Column(db.Integer, primary_key=True)
tag = db.Column(db.String(15), nullable=True)
файл миграции - оригинал - показывает создание таблицы
def upgrade():
op.create_table('message_user',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=20), nullable=True)
sa.PrimaryKeyConstraint('id', name=op.f('pk_message_user'))
)
def downgrade():
op.drop_table('message_user')
файл миграции - после - показывает изменение таблицы
def upgrade():
op.add_column('message_user', sa.Column('tag', sa.String(length=15), nullable=True))
op.drop_column('message_user', 'name')
def downgrade():
op.add_column('message_user', sa.Column('name', mysql.VARCHAR(collation='utf8_bin',
length=20), nullable=True))
op.drop_column('message_user', 'tag')
Сценарии обновления описывают изменения чисто в терминах sqlalchemy, тогда как сценарии понижения добавляют mysql диалект, определяющий c изменения. В частности, сценарий обновления определяет тип как sa.String (length = 15), тогда как версия понижающего рейтинга определяет его как mysql .VARCHAR (collation = 'utf8_bin', length = 20). В операторах создания таблиц в сценариях перехода на более ранние версии автоматически созданный сценарий также включает mysql_collate, mysql_default_charset и mysql_engine, в то время как их нет в инструкциях создания таблиц для сценариев обновления. Я не видел никаких упоминаний об этом в документации alembi c. Кто-нибудь знает, почему это отличается?