2012-11-01 38 views
30

我有這個testingdatabase,到目前爲止,它已經被垃圾填滿。現在我已經在Rails控制檯中完成了一些Table.destroy_all命令,它刪除了所有非常棒的記錄和依賴關係。然而;我想截斷所有內容,以便ID等從1開始。 Rails 3有什麼方法嗎?用導軌控制檯截斷表格(s)

回答

104

接受的答案只有當你需要重新創建整個數據庫的工作。
要刪除一個表(與回調),並獲得的ID從1開始:

Model.destroy_all # Only necessary if you want to trigger callbacks. 
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY") 

如果你使用SQLite,它不支持截去這樣做到以下幾點:

Model.destroy_all # Only necessary if you want to trigger callbacks. 
ActiveRecord::Base.connection.execute("Delete from #{table_name}") 
ActiveRecord::Base.connection.execute("DELETE FROM SQLITE_SEQUENCE WHERE name='#{table_name}'") 
+2

當一張桌子被截斷時,你的回答是正確的(我感謝你)我選擇了Yam Marcovic的答案作爲接受的答案,因爲我確實要求「所有」被截斷。 – CaptainCarl

+4

感謝您的投票。問題的全部分貝要求並不明確!僅供參考,rake db:drop會丟棄數據庫。如果要求只是截斷所有表,你可以運行ActiveRecord :: Base.connection.tables.collect {| table_name | ActiveRecord :: Base.connection.execute(「TRUNCATE#{table_name}」)}。雖然它可能無法處理回調,但我想這不是必須的,因爲我們正在截斷所有的表。 –

+0

destroy_all將在每條記錄上調用destroy,這與截斷表非常不同。來自文檔:#通過實例化每個 #記錄並調用其+ destroy +方法銷燬匹配條件+的記錄。每個對象的回調是 #執行(包括:依賴關聯選項和 #+ before_destroy +/+ after_destroy +觀察器方法)。返回已銷燬的對象集合 #每個將被凍結,至 #反映不應該做任何更改(因爲它們不能被 #保留)。 – justingordon

3

只需在下一次測試運行時重建數據庫(這將在刪除後自動發生)。

rake db:drop RAILS_ENV=test

3

您也可以這樣做rake db:rollback STEP=3 RAILS_ENV=test

其中3表示您在db/migrate中進行的遷移次數。例如:如果我在

db/migrate 
20140121065542_create_users.rb 
20140121065710_create_profiles.rb 
20140121065757_create_articles.rb 
20140121065900_create_comments.rb 
20140121065929_create_categories.rb 

所以我有5個遷移總共刪除。如果我這樣做rake db:rollback STEP=5 RAILS_ENV=test所有表將從我的TEST數據庫中刪除,如果我刪除RAILS_ENV = test比所有ENVIRONNMENT(生產,測試,開發)表將被刪除,並且它還會從其遷移數據中清除db/shema.rb文件。

2

rake db:reset將執行rake db:drop db:setup。換句話說,刪除數據庫並重新設置數據庫。

Source

+0

通過這樣做,我們將丟失重要的數據,極不推薦。 –

0

(有點遲到了,我知道)

問做這個控制檯:

2.1.2 :001 > Post.all.each do |post| 
2.1.2 :002 > post.destroy! 
2.1.2 :003 > end 

工作,以及...

這基本上遍歷所有帖子並銷燬它們。 (雖然我使用Rails 4)

+2

1.不要使用'each',使用'find_each'。它確保您在一個查詢中不會得到十億條記錄 2.如果您需要從數據庫中刪除記錄(不需要運行任何回調),請不要使用循環。只要做'Post.delete_all' – Kukunin

4

這爲我工作>>> 的ActiveRecord :: Base的它不會改變你的自動遞增值,但...

同樣的邏輯也應該爲Rails 3以及工作。 connection.execute( 「TRUNCATE表格名」)

1

假設你使用MySQL或Postgre而不是SQLITE3(不支持TRUNCATE),你可以做到以下幾點:

MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) } 

注意,這將不調用ActiveRec ord回調。