在 Rails ActiveRecord 迁移中,`using:` 关键字

In Rails ActiveRecord Migrations, `using:` keyword

已决定将某些字段从 int 更新为 bigint
Rails 无法自动逆转这种迁移,因此建议我们必须创建 updown 操作,同时添加 using:
问题是,老实说,我似乎找不到关于 using: 做什么的文档,也找不到 rails 提出的建议的实际含义(超出我的推断)。

考虑到这一点,在以下示例中:

class UpdateModelFieldType < ActiveRecord::Migration[5.2]
  def change
    reversible do |dir|
      dir.up do
        change_column :model,
                      :field,
                      :bigint,
                      using: 'field::bigint', algorithm: :concurrently

      end

      dir.down do
        change_column :model,
                      :field,
                      :int,
                      using: 'field::int',
                      algorithm: :concurrently
      end
    end
  end
end

抱歉,我在 official docs 中找不到关于 :using 选项的任何内容,但我可以告诉您它的作用,并为您指出 PostgreSQL 文档。

using: expr 选项向 ALTER TABLE 语句添加一个 USING 子句,该语句被发送到数据库以更改列的类型,以便您得到:

alter table models alter column fields type bigint using 'field::bigint' 

而不仅仅是:

alter table models alter column fields type bigint

那么USING子句有什么作用呢? fine manual says:

SET DATA TYPE
This form changes the type of a column of a table. [...] The optional USING clause specifies how to compute the new column value from the old; if omitted, the default conversion is the same as an assignment cast from old data type to new. A USING clause must be provided if there is no implicit or assignment cast from old to new type.

因此 using: expr 选项告诉数据库如何将旧列值转换为新类型的值。

现在 field::bigint 是什么意思?那是 PostgreSQL-specific type cast。标准 SQL 版本为 cast(field as bigint).