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 上创建前一个约束定义的情况下不会创建它们。
我正在尝试部署到 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 上创建前一个约束定义的情况下不会创建它们。