2012-03-16 48 views
108

由於一些部署問題,我停止在git中跟蹤schema.rb。不知何故,我已經塞滿了這個和我的schema.rb文件已經消失的地方。丟失了我的schema.rb!它可以再生嗎?

有沒有從數據庫或遷移中重新生成schema.rb的方法?我不想丟失現有數據。

回答

174

如果你運行一個rake -T它會列出你Rails項目的所有可能的rake任務。其中之一是db:schema:dump這將從數據庫重新創建Rails應用程序的schema.rb。

bundle exec rake db:schema:dump 
+0

非常感謝,很多答案,但看起來像你是第一(只),所以請爲你打勾。只是好奇,這是從數據庫本身還是從遷移生成模式? – brad 2012-03-16 04:03:57

+7

從數據庫本身開始,如果在遷移之外發生更改,請小心。 – mguymon 2012-03-16 04:08:45

+1

schema.rb在rails 2.0上的'rake db:schema:dump'後仍然包含空的模式 – 2016-01-07 03:30:13

11
rake db:schema:dump 

我認爲這在Rails 3中仍然有效 - 它從數據庫重新生成schema.rb。

3

如果您在本地重新生成schema.rb,則應該沒問題。它只是表示數據庫表的結構。數據本身不包含在這個文件中。

要重新生成schema.rb文件,運行:

bundle exec rake db:schema:dump 

然後,只需提交新schema.rb文件,你應該是在良好的狀態!

46

小心,

rake db:schema:dump 

將轉儲當前數據庫架構從DB。這意味着,如果您對遷移進行了任何更改,他們將NOT反映在schema.rb文件中,這不是您想要的IMO。

如果你想重新創建從遷移的模式,做到以下幾點:

rake db:drop # ERASES THE DATABASE !!!! 
rake db:create 
rake db:migrate 
+0

這會導致數據丟失,OP說他們希望避免數據丟失。另外,正如科林指出的那樣,純粹從遷移中重新生成數據庫可能是一個非常糟糕的想法,因爲運行在奇怪的依賴性問題上的可能性增加了(一般來說)。如果有未決的遷移,最好在開發機器上運行最後的遷移,然後運行'rake db:schema:dump'命令。 – 2014-09-10 15:26:05

+2

我的答案清楚地解釋了每個畫布。我只是通過運行schema:dump而沒有獲得一個乾淨的模式而被咬住了。 OP正在討論如何在CVS中跟蹤模式。我希望我的模式與我的遷移中的定義保持一致,而不是來自生產數據庫或舊開發數據庫的廢棄版本 – gamov 2014-09-11 03:50:35

3
從schema.rb文件本身直接

如果你需要創建應用程序數據庫在另一個 系統上,您應該使用db:schema:load,而不是從零開始運行所有遷移 。後者是一種有缺陷和不可持續的方法(您將積累更多的遷移數據,其運行速度越慢,發生問題的可能性越大)。

所以不要做rake db:migrate的建議,這是在撰寫本文的時候提出的 - 最低評分的答案。

+0

如果在開發計算機上有任何未完成的遷移,那麼在重新生成之前可能需要運行最後幾個待定遷移模式,但是純粹從遷移中重新生成數據庫是一個非常糟糕的主意,尤其是因爲這會導致數據丟失。 – 2014-09-10 15:23:23

0

我也有類似的問題,即使我刪除了遷移,我的舊模式不刷新。

因此,我所做的是刪除數據庫中的所有現有表並再次遷移它們。然後運行「db:schema:load」命令給了我一個新的schema.rb。

drop table my_table_name // deleted them indivisully 
rake db:migrate 
rake db:schema:dump // re-created a new schema 
2

導軌5路:

rails db:schema:dump 

,或者如果您遇到寶石:: LoadError,則:

bundle exec rails db:schema:dump 

注:

在軌5建議通過使用rails而不是rake來生成/執行任務,這僅僅是爲了記住,rails生成的任務是擴展.rake請參見lib/tasks/myTask.rake。這意味着這些任務也可以通過預先加入rake來執行。

相關問題