Rails迁移为Postgres的Users表jsonb列回填默认值
Rails 4.2.11 + PostgreSQL:为旧用户jsonb列回填"A":0并保留原有数据
解决方案步骤:
生成迁移文件
在终端执行以下命令创建专门处理数据回填的迁移:rails generate migration AddAToUsersConfigs编写迁移逻辑
打开生成的迁移文件(路径为db/migrate/[timestamp]_add_a_to_users_configs.rb),替换默认内容为以下代码:class AddAToUsersConfigs < ActiveRecord::Migration def up # 为configs中不存在"A"键的旧用户添加"A":0,保留原有B/C/D值 execute <<-SQL UPDATE users SET configs = configs || '{"A": 0}'::jsonb WHERE configs ? 'A' = false; SQL end def down # 回滚操作:移除configs中的"A"键 execute <<-SQL UPDATE users SET configs = configs - '{"A"}'::text[] WHERE configs ? 'A' = true; SQL end end
关键逻辑说明:
configs || '{"A": 0}'::jsonb:PostgreSQL的jsonb合并操作,会将新键值对添加到原有jsonb对象中,不会覆盖已存在的B/C/D键值。WHERE configs ? 'A' = false:仅对未包含"A"键的用户执行更新,避免重复操作、提升执行效率。- 回滚逻辑:使用
configs - '{"A"}'::text[]移除指定键,确保迁移具备可回滚能力。
注意事项:
- 执行迁移前请备份数据库,并优先在测试环境验证效果。
- 若用户量较大,建议在业务低峰时段执行操作,避免影响正常业务。
内容的提问来源于stack exchange,提问作者Priyanshu0007
相关产品推荐
相关产品推荐

