繁体   English   中英

通过Flask迁移难以升级我的登台数据库

[英]Hard to upgrade my staging db through flask migrate

我想将对本地数据库所做的更改应用于云数据库。

我的本地数据库有三个表, Useremail_historyevent_monitor 我已经删除了我的地方迁移,文件夹,然后跑了python manage.py db initpython manage.py db migrate命令。

它将创建一个修订文件,如下所示。

"""empty message

Revision ID: 9bd307a576ce
Revises: 
Create Date: 2017-03-01 00:10:32.344698

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql

# revision identifiers, used by Alembic.
revision = '9bd307a576ce'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('user')
    op.drop_table('email_history')
    op.drop_table('event_monitor')
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('event_monitor',
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False),
    sa.Column('event_type', mysql.VARCHAR(length=80), nullable=True),
    sa.Column('event_description', mysql.TEXT(), nullable=True),
    sa.PrimaryKeyConstraint('id'),
    mysql_default_charset=u'latin1',
    mysql_engine=u'InnoDB'
    )
    op.create_table('email_history',
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False),
    sa.Column('user_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=False),
    sa.Column('email_type', mysql.ENUM(u'SAMPLE'), nullable=True),
    sa.Column('datetime_created', mysql.DATETIME(), nullable=True),
    sa.Column('datetime_sent', mysql.DATETIME(), nullable=True),
    sa.Column('status', mysql.TINYINT(display_width=1), autoincrement=False, nullable=False),
    sa.ForeignKeyConstraint(['user_id'], [u'user.id'], name=u'email_history_ibfk_1', ondelete=u'CASCADE'),
    sa.PrimaryKeyConstraint('id'),
    mysql_default_charset=u'latin1',
    mysql_engine=u'InnoDB'
    )
    op.create_table('user',
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False),
    sa.Column('username', mysql.VARCHAR(length=80), nullable=True),
    sa.Column('email', mysql.VARCHAR(length=120), nullable=False),
    sa.Column('password_hash', mysql.VARCHAR(length=256), nullable=True),
    sa.PrimaryKeyConstraint('id'),
    mysql_default_charset=u'latin1',
    mysql_engine=u'InnoDB'
    )
    # ### end Alembic commands ###

如果我做

export config=prod && python manage.py db upgrade

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1051, "Unknown table 's2sdevdb.user'") [SQL: u'\\nDROP TABLE user']错误。 是的,我已经删除了云数据库上的表。

我的问题是,为什么migration命令无法创建用于创建表的代码? 我如何完成这项任务?

在本地,您删除了迁移,但是您的数据仍然存在。 创建迁移时,Alembic会查看您的代码并找到一些模型,再查看数据库并找到那些仍然存在的表,因此不会生成用于创建表的代码。

大概不再有代表它为其生成放置命令的三个表的模型。

要创建代表所有模型的迁移,数据库必须为空。 要么删除表,要么指向一个空的数据库。 Alembic会生成alembic_version表,您可能还需要删除该表。


在远程,您删除了表,然后尝试运行迁移以删除表。 由于给定的原因,它失败:不存在要删除的表。

由于您搞砸了并手动执行了迁移,因此请使用manage.py db stamp head告诉Alembic您的数据库已经代表了当前的迁移。

假设您确实重置了远程数据库,那么显示的命令可以很好地运行新迁移。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM