flask数据库(mysql)迁移migrate出现错误
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1050, “Table ‘xxxx’ already exists”)
问题
修改了模型类中的某一个字段
#更改前name = db.Column(db.String(28), nullable=False)
name = db.Column(db.String(36), nullable=False)
执行python database.py db upgrade的时候,出现sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1050, “Table ‘xxxx’ already exists”)的报错
migrate 总是检测我的操作是重新建立我这个字段所在的表而不是 修改字段。
解决
打开migrations\versions下对应生成的迁移文件,发现自己的修改与migrate生成的迁移命令不同
其实迁移文件中有句话:# ###Alembic自动生成命令,请调整!###
upgrade中的内容和我的修改内容不一致,只能手动修改
这里以改变字段name的长度为例:
删除原来的
op.create_table('xxxx',
sa.Column('create_time', sa.DateTime(), nullable=True),
sa.Column('update_time', sa.DateTime(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
......
op.drop_table('xxxx')
添加上
from sqlalchemy.dialects import mysql
op.alter_column('ib_admin', 'name',
existing_type=mysql.VARCHAR(length=36),
nullable=False)
即:
总结
自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容。对比不一定完全正确,有可能会遗漏一些细节,需要进行检查。
发现外键的似乎对比不出来。即模型类的外键部分没有变动,生成迁移文件的时候,还是会生成关于外键变化的迁移内容。
发现迁移文件有误后,其他的更改参考官方文档
migrate迁移文件的更改命令