很难通过 flask migrate 升级我的暂存数据库
Hard to upgrade my staging db through flask migrate
我想将对本地数据库所做的更改应用到云数据库。
我的本地数据库有三个表,User
、email_history
、event_monitor
。我删除了本地迁移文件夹,然后删除了 运行 python manage.py db init
、python 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']
错误。是的,我已经删除了云数据库上的表。
我的问题是,为什么 migrate 命令无法创建用于创建表的代码?我如何完成这个任务?
在本地,您删除了迁移,但您的数据仍然存在。当您创建迁移时,Alembic 查看您的代码并找到一些模型,查看数据库并发现那些 tables 仍然存在,因此不会生成代码来创建 tables。
据推测,不再有模型代表它生成的三个 tables 下降命令。
要创建代表所有模型的迁移,您的数据库必须为空。删除 table 或指向一个空数据库。 Alembic 生成一个 alembic_version
table,您可能还需要删除它。
远程删除 tables,然后尝试 运行 删除 tables 的迁移。它因给定原因而失败:table 不存在,无法删除。
由于您搞砸了并手动执行了迁移,请使用 manage.py db stamp head
告诉 Alembic 您的数据库已经代表当前迁移。
假设您确实重置了远程数据库,那么您显示的命令对 运行 您的新迁移工作正常。
我想将对本地数据库所做的更改应用到云数据库。
我的本地数据库有三个表,User
、email_history
、event_monitor
。我删除了本地迁移文件夹,然后删除了 运行 python manage.py db init
、python 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']
错误。是的,我已经删除了云数据库上的表。
我的问题是,为什么 migrate 命令无法创建用于创建表的代码?我如何完成这个任务?
在本地,您删除了迁移,但您的数据仍然存在。当您创建迁移时,Alembic 查看您的代码并找到一些模型,查看数据库并发现那些 tables 仍然存在,因此不会生成代码来创建 tables。
据推测,不再有模型代表它生成的三个 tables 下降命令。
要创建代表所有模型的迁移,您的数据库必须为空。删除 table 或指向一个空数据库。 Alembic 生成一个 alembic_version
table,您可能还需要删除它。
远程删除 tables,然后尝试 运行 删除 tables 的迁移。它因给定原因而失败:table 不存在,无法删除。
由于您搞砸了并手动执行了迁移,请使用 manage.py db stamp head
告诉 Alembic 您的数据库已经代表当前迁移。
假设您确实重置了远程数据库,那么您显示的命令对 运行 您的新迁移工作正常。