0

我试图部署到heroku。首先,我推送到GIT和heroku(使用git push heroku)。然后,我想迁移使用heroku run rake db:migrate分贝,但迁移之后,部分地得到了以下错误消息:Heroku db迁移错误:PG :: DuplicateObject:错误:关系约束已经存在

-- 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的美洲狮服务器。

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

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是双?如果是这样,我应该删除什么?

回答

2

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

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

+0

我使用SQLite进行开发,并使用PostgreSQL(通过Heroku)进行部署。我正确地理解我可能在两次定义外键的迁移文件中?我在原始帖子中添加了更新。您是否可以确认更新中的其中一行应该被删除? – Nick

+1

@Nick:(1)如果你打算部署其他的东西,停止在SQLite之上开发。 (2)'foreign_key:true'可能会创建FK,然后'add_foreign_key'尝试再次添加它。 –

+0

是的,删除原始文章中更新的第8行解决了它。将做一些研究,以了解如何将开发中的SQLite切换到PostgeSQL。 – Nick

相关问题