sql - 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。我该如何做到这一点?
解决方案
uuid-ossp
首先,使用and创建迁移pgcrypto
class EnableUuidExtension < ActiveRecord::Migration[5.2]
def change
enable_extension 'uuid-ossp'
enable_extension 'pgcrypto'
end
end
然后,创建另一个迁移以转换id
为uuid
. 例如,
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
推荐阅读
- functional-programming - 球拍定义列表
- sql - 如何根据条件按组选择第一项?
- microsoft-graph-api - 应该使用哪些资源通过 Graph v1.0 API 创建对特定日历的订阅
- ios - 从深层链接启动应用程序时未调用 AppDelegate ContinueUserActivity,应归咎于 Firebase SDK
- r - R中的nlcom(Stata)等价物?回归系数的非线性变换
- python - 带有滚动条的 TextView - Python 3 Glade Gtk +3
- c# - 每年增加时如何增加 var?
- python - 如何使用 Grouper 进行分组,但我想在频率中使用最近的日期作为参考
- python - Django:按“event__pk”聚合
- c++ - Can't Get _UNICODE Undefined using Character Set Setting in VS 2017 C++