由於一些部署問題,我停止在git中跟蹤schema.rb。不知何故,我已經塞滿了這個和我的schema.rb文件已經消失的地方。丟失了我的schema.rb!它可以再生嗎?
有沒有從數據庫或遷移中重新生成schema.rb的方法?我不想丟失現有數據。
由於一些部署問題,我停止在git中跟蹤schema.rb。不知何故,我已經塞滿了這個和我的schema.rb文件已經消失的地方。丟失了我的schema.rb!它可以再生嗎?
有沒有從數據庫或遷移中重新生成schema.rb的方法?我不想丟失現有數據。
如果你運行一個rake -T
它會列出你Rails項目的所有可能的rake任務。其中之一是db:schema:dump這將從數據庫重新創建Rails應用程序的schema.rb。
bundle exec rake db:schema:dump
rake db:schema:dump
我認爲這在Rails 3中仍然有效 - 它從數據庫重新生成schema.rb。
如果您在本地重新生成schema.rb
,則應該沒問題。它只是表示數據庫表的結構。數據本身不包含在這個文件中。
要重新生成schema.rb
文件,運行:
bundle exec rake db:schema:dump
然後,只需提交新schema.rb
文件,你應該是在良好的狀態!
小心,
rake db:schema:dump
將轉儲當前數據庫架構從DB。這意味着,如果您對遷移進行了任何更改,他們將NOT反映在schema.rb文件中,這不是您想要的IMO。
如果你想重新創建從遷移的模式,做到以下幾點:
rake db:drop # ERASES THE DATABASE !!!!
rake db:create
rake db:migrate
這會導致數據丟失,OP說他們希望避免數據丟失。另外,正如科林指出的那樣,純粹從遷移中重新生成數據庫可能是一個非常糟糕的想法,因爲運行在奇怪的依賴性問題上的可能性增加了(一般來說)。如果有未決的遷移,最好在開發機器上運行最後的遷移,然後運行'rake db:schema:dump'命令。 – 2014-09-10 15:26:05
我的答案清楚地解釋了每個畫布。我只是通過運行schema:dump而沒有獲得一個乾淨的模式而被咬住了。 OP正在討論如何在CVS中跟蹤模式。我希望我的模式與我的遷移中的定義保持一致,而不是來自生產數據庫或舊開發數據庫的廢棄版本 – gamov 2014-09-11 03:50:35
:
如果你需要創建應用程序數據庫在另一個 系統上,您應該使用
db:schema:load
,而不是從零開始運行所有遷移 。後者是一種有缺陷和不可持續的方法(您將積累更多的遷移數據,其運行速度越慢,發生問題的可能性越大)。
所以不要做rake db:migrate
的建議,這是在撰寫本文的時候提出的 - 最低評分的答案。
如果在開發計算機上有任何未完成的遷移,那麼在重新生成之前可能需要運行最後幾個待定遷移模式,但是純粹從遷移中重新生成數據庫是一個非常糟糕的主意,尤其是因爲這會導致數據丟失。 – 2014-09-10 15:23:23
我也有類似的問題,即使我刪除了遷移,我的舊模式不刷新。
因此,我所做的是刪除數據庫中的所有現有表並再次遷移它們。然後運行「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
導軌5路:
rails db:schema:dump
,或者如果您遇到寶石:: LoadError,則:
bundle exec rails db:schema:dump
注:
在軌5建議通過使用rails
而不是rake
來生成/執行任務,這僅僅是爲了記住,rails生成的任務是擴展.rake
請參見lib/tasks/myTask.rake
。這意味着這些任務也可以通過預先加入rake
來執行。
非常感謝,很多答案,但看起來像你是第一(只),所以請爲你打勾。只是好奇,這是從數據庫本身還是從遷移生成模式? – brad 2012-03-16 04:03:57
從數據庫本身開始,如果在遷移之外發生更改,請小心。 – mguymon 2012-03-16 04:08:45
schema.rb在rails 2.0上的'rake db:schema:dump'後仍然包含空的模式 – 2016-01-07 03:30:13