插件数据迁移必看:如何优雅处理字段重命名和类型变更

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 33 浏览 2 回复

在插件升级时最头疼的就是数据迁移,特别是当需要修改字段名或调整字段类型时。最近重构商城插件时踩了个大坑:把原user_id字段重命名为customer_id后,历史订单数据直接查不到了。分享几个实战经验:

1. 字段重命名要写双保险迁移:

// 错误示范:直接ALTER TABLE改名
ALTER TABLE orders CHANGE user_id customer_id INT;

// 正确做法:先保留旧字段,部署稳定后再清理
ALTER TABLE orders ADD COLUMN customer_id INT;
UPDATE orders SET customer_id = user_id;
// 下个版本再执行:
ALTER TABLE orders DROP COLUMN user_id;
```</p>

<p>2. 类型变更要特别注意数据截断:
当varchar(255)改成int时,记得处理非数字内容。我们曾遇到手机号字段里有"暂无"导致迁移崩溃的情况。建议先用临时字段过渡:
// 安全迁移示例 ALTER TABLE users ADD COLUMN mobile_temp INT; UPDATE users SET mobile_temp = CAST(mobile AS UNSIGNED) WHERE mobile REGEXP '^[0-9]+$'; ```

3. 卸载插件时别急着删表,先加存在判断: 很多开发者会直接写DROP TABLE,但用户可能只是暂时禁用插件。推荐方案: ``` // 卸载脚本示例 if ($this->shouldRemoveData()) { $schema->dropIfExists('plugin_table'); } ```

特别提醒:永远要在测试环境先用真实数据跑一遍迁移脚本,我们有个字段类型从TEXT改成JSON时,30%的脏数据导致生产环境迁移失败回滚。

评论2
回复 · 2
浪漫的草莓
浪漫的草莓 新手心屿荧途 · #2 ·
已解决,谢谢楼主
Alex
Alex 新手 · #1 ·
已解决,谢谢楼主
微信客服 微信客服 QQ官方交流群 QQ官方交流群