2016-05-14 100 views
0

所以..我嘗試我的數據庫遷移到Heroku的首次,這樣做的:Heroku的耙DB遷移錯誤關係「後」不存在

heroku rake db:migrate 

但即時得到的是我不能這個可怕的錯誤解決!

** Invoke db:migrate (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Invoke db:load_config (first_time) 
** Execute db:load_config 
** Execute db:migrate 
    ActiveRecord::SchemaMigration Load (1.8ms) SELECT "schema_migrations".* FROM "schema_migrations" 
Migrating to CreateComments (20150528110329) 
    (1.6ms) BEGIN 
== 20150528110329 CreateComments: migrating =================================== 
-- create_table(:comments) 
    (9.4ms) CREATE TABLE "comments" ("id" serial primary key, "name" character varying, "body" character varying, "post_id" integer, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL) 
    (3.8ms) CREATE INDEX "index_comments_on_post_id" ON "comments" ("post_id") 
    (6.4ms) ALTER TABLE "comments" ADD CONSTRAINT "fk_rails_2fd19c0db7" 
FOREIGN KEY ("post_id") 
    REFERENCES "posts" ("id") 

PG::UndefinedTable: ERROR: relation "posts" does not exist 
: ALTER TABLE "comments" ADD CONSTRAINT "fk_rails_2fd19c0db7" 
FOREIGN KEY ("post_id") 
    REFERENCES "posts" ("id") 

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

什麼我可以理解的是,它試圖從那不存在的又一個表格來引用..但我不知道如何先創建我的帖子表...

schema.rb>

 ActiveRecord::Schema.define(version: 20150622053408) do 

    create_table "comments", force: :cascade do |t| 
    t.string "name" 
    t.string "body" 
    t.integer "post_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "comments", ["post_id"], name: "index_comments_on_post_id" 

    create_table "posts", force: :cascade do |t| 
    t.string "title" 
    t.text  "subtitle" 
    t.text  "content" 
    t.string "img" 
    t.string "category" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "taggings", force: :cascade do |t| 
    t.integer "tag_id" 
    t.integer "taggable_id" 
    t.string "taggable_type" 
    t.integer "tagger_id" 
    t.string "tagger_type" 
    t.string "context",  limit: 128 
    t.datetime "created_at" 
    end 

    add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true 
    add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context" 

    create_table "tags", force: :cascade do |t| 
    t.string "name" 
    t.integer "taggings_count", default: 0 
    end 

    add_index "tags", ["name"], name: "index_tags_on_name", unique: true 

end 

我試着以任何方式切換我的代碼,但沒有結果。

希望有人能幫助我......謝謝你的一切!

+0

您是否需要保留數據庫中的數據? – bkunzi01

+0

是的。如果可以的話...... –

回答

1

我認爲沿線的某處進行了一次遷移編輯(如果不正確回退第一次等問題會出現問題),現在正在引發一個主要問題。既然你需要保留數據,並且不能完成數據庫:回滾我會說,除非別人有更好的主意,否則我可以想到的可能是一個選項。我從來不建議編輯遷移文件,但過去在某些情況下我必須這樣做。請執行下列操作,並確保你記住,到數據庫的任何變化不能用一個簡單的
git checkout .

我將手動創建一個新的遷移文件被撤銷,而不是使用軌道發電​​機,並給它在註釋表遷移文件的時間戳之前幾秒鐘的時間戳。然後,我將在該遷移中創建Posts表格,並編輯另一個創建Posts表格的現有遷移以添加它的列。然後您必須進入數據庫(不是您的rails控制檯,而是可能是Postgres的數據庫)並將此遷移插入到「schema_migrations」表中。當您生成遷移並運行db:migrate時,這個schema_migrations表由rails自動設置。您會注意到此schema_migrations表中的條目按「版本」列出,其中版本是遷移文件夾中遷移的時間戳。然後,您必須將遷移文件時間戳添加到您的schema_migrations表中,它應該很好。

更新:如果您不關心丟失數據,您可以回滾所有遷移,編輯您的遷移文件,然後重新運行它們。

bundle exec rake db:migrate:status #Look at the first version id and copy it. 

bundle exec rake db:rollback VERSION=theVersionNumberYouCopiedHere 

然後重新檢查遷移狀態與第一個命令,確保所有遷移狀態被列爲「下」。這將刪除所有表格等。然後進入你的遷移文件,並從評論表中刪除引用你的帖子表,這是給你的問題。然後再次重新運行所有遷移。然後添加你posts_id參考意見表通過生成並運行以下遷移如下:

rails g migration AddPostToComments post:references 

展望,移民文件,你會看到這樣的事情:

class AddPostToCommentss < ActiveRecord::Migration 
    def change 
    add_reference :comments, :post, index: true 
    add_foreign_key :comments, :posts 
    end 
end 

現在運行bundle exec rake db:migrate和你應該很好走。將所有更改提交到git,然後推送到heroku!

+0

我試過了,但是我不知道......還有其他方法嗎?在這一點上,我真的不在乎丟失數據。 –

+0

如果你不在乎丟失數據,我會以更簡單的方式更新答案lol – bkunzi01

+1

謝謝你!你太棒了!在執行rake db之前,我忘記了用git來配合:遷移。現在即時通訊還有其他錯誤,但我傳遞了所有數據。再次感謝。 –