请参阅此答案,了解我在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上整数?
答案 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()'
这将:
uid
列(只是为了获得正确的命名)uuid
列,类型设置为uuid
,生成在PG端处理。如果您已经使用Rails生成UUID(不推荐),您可以直接进入数据库并将列类型从integer
更改为string
我希望有所帮助!