【问题标题】:In Rails ActiveRecord Migrations, `using:` keyword在 Rails ActiveRecord 迁移中,`using:` 关键字
【发布时间】:2019-11-30 13:57:22
【问题描述】:

已决定将某些字段从 int 更新为 bigint
Rails 无法自动逆转这种迁移,因此建议我们必须同时创建一个up 和一个down 操作,同时添加一个using:
问题在于,老实说,我似乎无法找到关于 using: 的功能以及建议 rails 的实际含义的文档(超出我的推断范围)。

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

  • using: 是什么意思?
  • String 中的SQL 用作using: 的值是什么意思? (我可以推断,但我想要实际的定义)
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

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord database-migration rails-migrations


    【解决方案1】:

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

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

    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
    此表单更改表格列的类型。 [...] 可选的 USING 子句指定如何从旧列值计算新列值;如果省略,则默认转换与从旧数据类型到新数据类型的赋值转换相同。如果没有从旧类型到新类型的隐式或赋值强制转换,则必须提供 USING 子句。

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

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

    【讨论】:

    • 谢谢,正如我所说,我可以推断出很多,但我想要一个更具体的字典,比如答案。
    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 2018-03-07
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多