如何通过PeeWee-moves迁移脚本为MySQL表添加带随机UUID默认值的非空列
解决PeeWee-moves添加带NOT NULL约束列并填充自定义值的问题
因为直接添加带NOT NULL约束的列会因现有行无值触发MySQL约束错误,所以需要分三步完成迁移:
- 先添加允许NULL的目标列
- 为现有行填充随机UUID值
- 修改列约束为
NOT NULL
具体迁移脚本实现
生成迁移文件后,修改迁移类的up和down方法如下:
from peewee_moves import Migration import uuid from your_project.models import UserInfo # 替换为你的模型导入路径 class Migration_20240520_add_user_game_id(Migration): def up(self): # 1. 添加允许NULL的user_game_id列 self.add_column('user_info', 'user_game_id', 'VARCHAR(36)', null=True) # 2. 为现有行填充随机UUID(小数据量适用) # 若数据量大,建议用下方SQL批量更新 for user in UserInfo.select(): user.user_game_id = str(uuid.uuid4()) user.save() # --- 大数据量替换方案 --- # self.execute_sql("UPDATE user_info SET user_game_id = UUID();") # 3. 修改列为NOT NULL约束 self.execute_sql("ALTER TABLE user_info MODIFY COLUMN user_game_id VARCHAR(36) NOT NULL;") def down(self): # 回滚:删除新增列 self.drop_column('user_info', 'user_game_id')
关键说明
- 分步操作是核心:MySQL不允许直接给已有数据的表添加无默认值的
NOT NULL列,必须先填充值再修改约束 - 数据量大时优先用SQL批量更新,避免Python循环遍历带来的性能问题
- 确保
VARCHAR(36)的长度足够容纳UUID字符串(标准UUID是36位含连字符)
内容的提问来源于stack exchange,提问作者cold_coded
相关产品推荐
相关产品推荐

