在 Rails ActiveRecord 迁移中,`using:` 关键字
In Rails ActiveRecord Migrations, `using:` keyword
已决定将某些字段从 int
更新为 bigint
。
Rails 无法自动逆转这种迁移,因此建议我们必须创建 up
和 down
操作,同时添加 using:
。
问题是,老实说,我似乎找不到关于 using:
做什么的文档,也找不到 rails 提出的建议的实际含义(超出我的推断)。
考虑到这一点,在以下示例中:
using:
是什么意思?
- 作为
using:
的值使用的String
中的SQL
是什么意思? (我可以推断,但我想要实际的定义)
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)
.
已决定将某些字段从 int
更新为 bigint
。
Rails 无法自动逆转这种迁移,因此建议我们必须创建 up
和 down
操作,同时添加 using:
。
问题是,老实说,我似乎找不到关于 using:
做什么的文档,也找不到 rails 提出的建议的实际含义(超出我的推断)。
考虑到这一点,在以下示例中:
using:
是什么意思?- 作为
using:
的值使用的String
中的SQL
是什么意思? (我可以推断,但我想要实际的定义)
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)
.