您的位置:首页 > 运维架构

【Flask】Flask-Migrate使用upgrade命令时出现的DROP错误

2017-11-14 17:39 375 查看

问题描述

使用
migrate
初始化数据库后,以后只需要使用“迁移二连”就能满足需求

flask db migrate
flask db upgrade


不过在某次修改表的列之后出现了错误

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) \
near "DROP": syntax error \
[SQL: 'ALTER TABLE comment DROP COLUMN date']


解决方法

由于我使用的
SQLite
,没有
drop
的命令,要想修改它的表,只能新建一个表,复制,删除旧表,修改新表名

Migrate
封装的
Alembic
,我不知道
Alembic
怎么修改的表,但是我查看
migrates/versions
文件夹中的版本文件的时候,发现了这么几个语句

def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('comment', sa.Column('body', sa.Text(), nullable=True))
op.add_column('comment',
sa.Column('timestamp', sa.DateTime(), nullable=True))
op.drop_column('comment', 'date')
op.drop_column('comment', 'text')
# ### end Alembic commands ###


这是
Migrate
自动生成的操作语句

可是
Alembic
删除列的语句比较特殊,需要把删除列的语句放在
with


with op.batch_alter_table('comment') as batch_op:
batch_op.drop_column('date')
batch_op.drop_column('text')


所以,解决方法就是把
Migrate
自动生成的删除列的语句放在对应表的
with


这时候就可以执行
upgrade
命令了

如果出现
duplicate column name
错误,说明删除列语句前面的操作已经执行了,只需要执行
downgrade
,然后再执行
upgrade


重新创建

如果还是解决不了问题,而且数据库的数据量不是很大,那么解决所有问题的方法,就是重新创建数据库

删除
migrations
文件夹和数据库文件

然后再执行
Migrate
的创建命令

flask db init
flask db migrate flask db upgrade
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐