flask: migrate报pymysql.err.OperationalError: (1138, 'Invalid use of NULL value')

一,报错信息:

pymysql.err.OperationalError: (1138, 'Invalid use of NULL value')

原因:

数据库中已经有了值为null的数据时,

此时再把此字段修改成nullable=False

就会报这个错误
 

二,解决方法之一:

删除字段重新添加
 

三,解决方法之二:

$ flask db migrate -m '改subject_id字段为非空'
...
 Generating /data/yourproject/migrations/versions/95d973bcd2eb_改subject_id字段为非空.py ...  done

编辑上面生成的迁移脚本:

在upgrade中,alter_column之前增加一行:

batch_op.execute("UPDATE articles SET subject_id = 0 WHERE subject_id IS NULL;")

就是执行一条sql把字段中的空值处理成0,这样后面改为非空时就不会因为有空值而报错了

如下:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    with op.batch_alter_table('articles', schema=None) as batch_op:
        batch_op.execute("UPDATE articles SET subject_id = 0 WHERE subject_id IS NULL;")
        batch_op.alter_column('subject_id',
               existing_type=mysql.INTEGER(),
               nullable=False,
               comment='话题id')

    # ### end Alembic commands ###

当然,也可以先手动执行此sql

posted @ 2025-12-01 12:45  刘宏缔的架构森林  阅读(6)  评论(0)    收藏  举报