Rails 迁移,如何以批处理方式将多个列添加到 table
Rails Migration, how to add multiple columns to a table in batch mode
当我想向现有的 table 添加多个列时,我可以这样做:
rails g migration AddColumnsToUser col1:integer col2:integer .. etc.
这将生成包含几行的迁移:
def change
add_column :users, :col1, :integer
add_column :users, :col2, :integer
end
这将在几个 alter table
命令中被翻译到后端数据库:
ALTER TABLE users ADD COLUMN col1 SMALLINT(6) NOT NULL;
ALTER TABLE users ADD COLUMN col2 SMALLINT(6) NOT NULL;
问题是,如果你正在处理一个大 table,这些 alter table
中的每一个都会花费很多时间,在 MySQL 中更少,因为后端引擎将生成 table 的副本,并将执行许多昂贵的过程。所有这些工作都必须为我要添加的每一列完成。
所以,我的问题是,我如何才能将所有这些 add_column
句子集中在一个句子中,以便在批处理模式下得到一个 alter table
,如下所示:
ALTER TABLE users
ADD COLUMN col1 SMALLINT(6) NOT NULL,
ADD COLUMN col2 SMALLINT(6) NOT NULL;
如果你想要多条语句或自定义 sql 走这条路:
execute <<-SQL
ALTER TABLE users
ADD COLUMN col1 SMALLINT(6) NOT NULL,
ADD COLUMN col2 SMALLINT(6) NOT NULL;
SQL
您可以在迁移中使用 change_table 选项 bulk: true。
当我想向现有的 table 添加多个列时,我可以这样做:
rails g migration AddColumnsToUser col1:integer col2:integer .. etc.
这将生成包含几行的迁移:
def change
add_column :users, :col1, :integer
add_column :users, :col2, :integer
end
这将在几个 alter table
命令中被翻译到后端数据库:
ALTER TABLE users ADD COLUMN col1 SMALLINT(6) NOT NULL;
ALTER TABLE users ADD COLUMN col2 SMALLINT(6) NOT NULL;
问题是,如果你正在处理一个大 table,这些 alter table
中的每一个都会花费很多时间,在 MySQL 中更少,因为后端引擎将生成 table 的副本,并将执行许多昂贵的过程。所有这些工作都必须为我要添加的每一列完成。
所以,我的问题是,我如何才能将所有这些 add_column
句子集中在一个句子中,以便在批处理模式下得到一个 alter table
,如下所示:
ALTER TABLE users
ADD COLUMN col1 SMALLINT(6) NOT NULL,
ADD COLUMN col2 SMALLINT(6) NOT NULL;
如果你想要多条语句或自定义 sql 走这条路:
execute <<-SQL
ALTER TABLE users
ADD COLUMN col1 SMALLINT(6) NOT NULL,
ADD COLUMN col2 SMALLINT(6) NOT NULL;
SQL
您可以在迁移中使用 change_table 选项 bulk: true。