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

相關問題