首页 > 解决方案 > Rails 和 PSQL:如何将 STRING 类型的列转换为具有后备值的 UUID

问题描述

我正在使用一个名为“pgcrypto”的扩展来添加对 UUID 的支持。

目前我有一个名为creator_id字符串类型的列,但我想将其类型更改为 UUID。

起初我试过:

change_column :communities, :creator_id, :uuid

我得到了这个:

PG::DatatypeMismatch: ERROR:  column "creator_id" cannot be cast automatically to type uuid
HINT:  You might need to specify "USING creator_id::uuid".

所以我尝试了:

change_column :communities, :creator_id, "uuid USING creator_id::uuid"

问题是,在开发的早期阶段,它充满了甚至看起来不像 UUID 的占位符值,所以我收到以下错误:

PG::InvalidTextRepresentation: ERROR:  invalid input syntax for type uuid

因此,当引发此类异常时,我想回退到一些默认的 UUID。我该如何做到这一点?

标签: sqlruby-on-railsrubypostgresql

解决方案


uuid-ossp首先,使用and创建迁移pgcrypto

class EnableUuidExtension < ActiveRecord::Migration[5.2]
      def change
        enable_extension 'uuid-ossp'
        enable_extension 'pgcrypto'
      end
    end

然后,创建另一个迁移以转换iduuid. 例如,

class ChangeIdToUuidInUser < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :uuid, :uuid, default: 'uuid_generate_v4()', 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

然后使用此命令打开 postgres 数据库psql -U username databaseName 您将进入 postgres shell,运行以下命令

=# CREATE EXTENSION pgcrypto;
=# \q

最后,运行rails db:migrate


推荐阅读