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。

https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_table