Heroku db migration error: PG::DuplicateObject: ERROR: constraint for relation already exists

Heroku db migration error: PG::DuplicateObject: ERROR: constraint for relation already exists

我正在尝试部署到 heroku。首先,我推送到 GIT 和 heroku(使用 git push heroku)。然后我想使用 heroku run rake db:migrate 迁移数据库,但迁移后部分收到以下错误消息:

-- add_foreign_key(:members, :organizations)
   (16.5ms)  ALTER TABLE "members" ADD CONSTRAINT "fk_rails_43c258b686"
FOREIGN KEY ("organization_id")
  REFERENCES "organizations" ("id")

PG::DuplicateObject: ERROR:  constraint "fk_rails_43c258b686" for relation "members" already exists
: ALTER TABLE "members" ADD CONSTRAINT "fk_rails_43c258b686"
FOREIGN KEY ("organization_id")
  REFERENCES "organizations" ("id")

   (1.2ms)  ROLLBACK
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateObject: ERROR:  constraint "fk_rails_43c258b686" for relation "members" already exists
: ALTER TABLE "members" ADD CONSTRAINT "fk_rails_43c258b686"
FOREIGN KEY ("organization_id")
  REFERENCES "organizations" ("id")
/app/vendor/bundle/ruby/2.1.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:155:in `async_exec'
/app/vendor/bundle/ruby/2.1.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:155:in `block in execute'
/app/vendor/bundle/ruby/2.1.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:473:in `block in log'
...etc.

我没有数据可以丢失,所以尝试了 heroku pg:reset DATABASE(也是因为我已经调整了现有的迁移文件,而不是每次都创建一个新文件)然后 heroku run rake db:migrate 但结果相同。

在开发中,运行 rake db:migrate 功能正常(我还使用 bundle exec rake db:reset 重置了开发数据库)。我在开发中似乎没有遇到问题,所以这似乎是一个 Heroku 问题。有谁知道可能是什么原因造成的?

也许也相关:我正在使用 Heroku 的 puma 服务器。

更新: 其中一个迁移文件包含:

1  def change
2    create_table :members do |t|
3      t.references :organization,   index: true,  foreign_key: true
4      t.string :email,              null: false
5      etc
6      t.timestamps null: false
7    end
8    add_foreign_key :members, :organizations
9    add_index :members, [:organization_id, :username]
10 end

第 3 行和第 8 行可能是双重的吗?如果是,我应该删除什么?

这只是表明已经存在从"members"."organization_id"到"organizations"."id"的外键。您可以在迁移失败后通过检查生产数据库来确认是否如此。

外键必须已由先前的迁移创建,可能是在创建成员 table 时创建的。你在开发中使用 PostgreSQL 吗?也许您使用的数据库对重复约束定义不那么挑剔,或者在生产中在 PostgreSQL 上创建前一个约束定义的情况下不会创建它们。