【问题标题】:Heroku db migration error: PG::DuplicateObject: ERROR: constraint for relation already existsHeroku db 迁移错误:PG::DuplicateObject: ERROR: 关系的约束已经存在
【发布时间】:2015-07-12 09:14:43
【问题描述】:

我正在尝试部署到 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 行是双行的?如果是,我应该删除什么?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 heroku database-migration


    【解决方案1】:

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

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

    【讨论】:

    • 我使用 SQLite 进行开发,使用 PostgreSQL(通过 Heroku)进行部署。我是否正确理解我可能在迁移文件中定义了两次外键?我在原始帖子中添加了更新。您能否确认应该删除更新中的其中一行?
    • @Nick: (1) 如果你打算在其他东西上部署,请停止在 SQLite 之上进行开发。 (2) foreign_key: true 可能正在创建 FK,然后 add_foreign_key 尝试再次添加它。
    • 是的,删除原帖中更新的第 8 行解决了它。将做一些研究以了解如何将开发中的 SQLite 切换到 PostgeSQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2013-02-04
    • 2013-01-10
    • 2023-03-08
    相关资源
    最近更新 更多