Rails 6升级后修改PostgreSQL字段为jsonb迁移报错的正确语法是什么
问题原因
Rails 6 调整了change_column方法的参数解析逻辑,不再支持将USING类型转换子句直接拼接在数据类型字符串中,此前的写法会将整段jsonb USING xxx识别为数据类型名传入PostgreSQL,因此触发无效类型名、语法错误等报错。
正确迁移写法
change_column :pages, :content, :jsonb, null: false, default: '[]', using: 'content::jsonb'
参数说明:
- 第三个参数直接传入
:jsonb指定目标字段类型即可,无需拼接转换逻辑 - 新增独立的
using参数传入类型转换表达式,content::jsonb和CAST(content AS jsonb)两种写法在PostgreSQL中效果完全一致,任选其一即可
注意事项
- 执行迁移前建议先清洗脏数据,避免无效JSON内容导致转换失败,可执行以下SQL查询不符合JSON格式的记录:
SELECT id, content FROM pages WHERE content IS NOT NULL AND NOT jsonb_valid(content::text);
- 调整后默认值
'[]'会自动被PostgreSQL识别为JSONB类型的空数组,无需额外转换。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

