You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PeeWee-moves迁移脚本为MySQL表添加带随机UUID默认值的非空列

解决PeeWee-moves添加带NOT NULL约束列并填充自定义值的问题

因为直接添加带NOT NULL约束的列会因现有行无值触发MySQL约束错误,所以需要分三步完成迁移:

  1. 先添加允许NULL的目标列
  2. 为现有行填充随机UUID值
  3. 修改列约束为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:54:20