在带有rails / postgres的heroku上,uid字符串被转换为整数

时间:2015-10-27 18:58:23

标签: ruby-on-rails postgresql heroku

请参阅此答案,了解我在rails应用中如何实现字符串主键:https://stackoverflow.com/a/1434819/4585520

在迁移中,指定了id: false并添加了一些自定义postgres执行代码(即execute "ALTER TABLE users ADD PRIMARY KEY (uid);",其中uid是一个字符串)。此外,在模型中,使用了self.primary_key = :uid。结果是我没有' id'专栏,只是' uid'列都是字符串。

但是,当我将此部署到Heroku并运行我的种子生成时,由于重复的uid,我会收到错误。我注意到添加的uid值是整数。也许我提供的字符串值正在被转换为整数(我在JSON文件中有UID并且正在导入它们,因此没有生成uid),这可以解释为什么它们会产生重复值。

为什么我的uids在他们正在开发中正确运行时才会在heroku上整数?

1 个答案:

答案 0 :(得分:0)

我不相信这是一个Heroku问题,而是迁移如何调整数据库的问题。

我还有一个Rails应用程序,它也使用UUID作为主键。在这里查看我在Heroku Postgres上的数据库:

   Column   |            Type             |                 Modifiers
------------+-----------------------------+-------------------------------------------
 id         | uuid                        | not null default uuid_generate_v4()
 data       | json                        | not null

这是我的迁移:

enable_extension 'uuid-ossp'
create_table :notifications, id: :uuid  do |t|
  t.json :data, null: false
end

我猜测您的迁移中可能未正确设置列类型。看一下heroku上的数据库(heroku pg:psql) - uid列是一个使用序列的整数吗?你看到像nextval('users_uid_seq'::regclass)这样的东西吗?如果是这样,则要求列为整数。我尝试以下迁移来修改您的数据库:

enable_extension 'uuid-ossp'
remove_column :users, :uid 
add_column :users, :uuid, :uuid, default: 'uuid_generate_v4()'

这将:

  1. 确保启用PG的UUID生成
  2. 删除当前的uid列(只是为了获得正确的命名)
  3. 创建一个新的uuid列,类型设置为uuid,生成在PG端处理。
  4. 如果您已经使用Rails生成UUID(不推荐),您可以直接进入数据库并将列类型从integer更改为string

    我希望有所帮助!