問題描述
使用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
原文鏈接:https://blog.csdn.net/White_Idiot/article/details/78533046