Flask-Migrate使用upgrade命令時出現的DROP錯誤

問題描述

使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章