我正在尝试将设计用户模型的 id 类型更改为 uuid。
我的迁移如下所示:
class ChangeUserIdTypeToUuid < ActiveRecord::Migration[5.2]
def up
change_column :users, :id, :uuid
end
def down
change_column :users, :id, :integer
end
end
Run Code Online (Sandbox Code Playgroud)
但是当我运行迁移时,我收到一个错误:
== 20180909205634 ChangeUserIdTypeToUuid: migrating ===========================
-- change_column(:users, :id, :uuid)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::DatatypeMismatch: ERROR: column "id" cannot be cast automatically to type uuid
HINT: You might need to specify "USING id::uuid".
: ALTER TABLE "users" ALTER COLUMN "id" TYPE uuid
Run Code Online (Sandbox Code Playgroud)
那里有一个提示,但我不知道它在暗示我做什么。不是这个:
change_column :users, :id, id::uuid
Run Code Online (Sandbox Code Playgroud)
为什么迁移失败?提示提示什么?如何将 ID 类型更改为 UUID?
参考这篇建议复制的帖子,我设法将id类型更改为uuid这样:
class ChangeUserIdTypeToUuid < ActiveRecord::Migration[5.2]
def change
add_column :users, :uuid, :uuid, default: "gen_random_uuid()", null: false
change_table :users do |t|
t.remove :id
t.rename :uuid, :id
end
execute "ALTER TABLE users ADD PRIMARY KEY (id);"
end
end
Run Code Online (Sandbox Code Playgroud)
与链接问题中最佳答案的不同之处在于 UUID 的生成方式。我使用 postgresql 作为我的开发数据库,所以我使用的gen_random_uuid()是由pgcrypto我之前启用的扩展提供的,以准备在另一个模型中使用 UUID:
class EnablePgcryptoExtension < ActiveRecord::Migration[5.2]
def change
enable_extension 'pgcrypto'
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6723 次 |
| 最近记录: |