ruby-on-rails - 没有默认的 Rails 迁移数组
问题描述
导轨 5,Postgres 9
我有超过 1000 万条模型记录。我需要添加具有数组类型的新字段。从文档中我可以添加新的迁移
add_column :model, :new_field, :string, array: true, default: []
但是在它之后,由于许多设置默认值的 Alter 操作,数据库被阻塞了。
创建没有(默认值:[])值的新数组字段是真的吗?
解决方案
- 在表中添加一列,默认值为
null
- 批量更新行(默认1000)并设置
[]
为值 NOT NULL
在列上设置
class AddCategoriesToProducts < ActiveRecord::Migration[6.0]
disable_ddl_transaction!
def up
ActiveRecord::Base.transaction do
add_column :products, :categories, :string, array: true
execute <<~SQL
ALTER TABLE products ALTER COLUMN categories SET DEFAULT '{}';
SQL
end
Product.find_in_batches(batch_size: 1000).with_index do |products, index|
puts "Processing #{index + 1}"
Product.where(id: products.map(&:id)).update_all(categories: [])
end
ActiveRecord::Base.transaction do
execute <<~SQL
ALTER TABLE products ALTER COLUMN categories SET NOT NULL;
SQL
end
end
def down
ActiveRecord::Base.transaction do
remove_column :products, :categories
end
end
end
这是一个缓慢的迁移,您必须等待它完成,但它会阻止锁定表。
推荐阅读
- nativescript - 自定义组件无法访问默认的 NativeScript 指令
- nested - Lisp:添加列表列表的各个元素
- vue.js - PhpStorm Vuetify 自动完成
- spring - Spring Framework 5.x 是否与 Oracle WebLogic 12c (12.2.1.3.0) 兼容?
- python - 装饰器的目的是什么(为什么要使用它们)?
- mysql - Codeigniter 连接的重复结果
- symfony - 信使rabbitmq symfony 4 ssl支持?
- sql - 时间序列图表数据的入口和出口点
- jquery - 数据表添加行
- neo4j - 如何删除neo4j中的所有索引?