heroku上的Rails:推送后,获取"PG :: UniqueViolation:ERROR:重复键值违反唯一约束"

den*_*kin 5 ruby postgresql ruby-on-rails heroku

之前已经多次询问过(这里这里,以及更多).

每次我将我的rails应用程序推送到Heroku(至少过去几个月,我会说),我必须使用熟悉的重置我的键

ActiveRecord::Base.connection.tables.each { |t|    ActiveRecord::Base.connection.reset_pk_sequence!(t) }
Run Code Online (Sandbox Code Playgroud)

咒语.否则,当我尝试创建新记录时,我得到这样的postgresql失败:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "users_clients_pkey" DETAIL: Key (id)=(401) already exists. : INSERT INTO "users_clients" ("user_id", "client_id") VALUES (20, 46) RETURNING "id"
Run Code Online (Sandbox Code Playgroud)

(这是一个示例;它发生在各种表上,具体取决于推送后在应用程序上执行的第一个操作.)

一旦我执行了重置键咒语,它就可以了,直到我下次推送到heroku ...即使我的推送不包括任何迁移.

我有点困惑为什么会发生这种情况以及可以采取哪些措施来防止这种情况发生.

不,我的部署任务中没有可数据化的操作代码.

Cur*_*ind 2

发生这种情况是因为主键(id)值已经存在。为什么?因为postgres中的主键顺序是混乱的。在不查看数据库或了解架构的情况下,很难提出解决方案,但如果您的数据库可以承受 10-15 分钟的停机时间。你可以试试

  1. 如果只有一张表那就有问题了。您可以将所有数据导出到新的一组表中,并使用新名称(不带 ID 列)。
  2. 删除现有表并将新创建的表重命名为旧表的名称。
  3. 再次启用写入我们的应用程序。

但是,如果整个数据库一团糟,那么它需要更复杂的东西,但如果不查看模式我就无法判断。