我有這個testingdatabase,到目前爲止,它已經被垃圾填滿。現在我已經在Rails控制檯中完成了一些Table.destroy_all命令,它刪除了所有非常棒的記錄和依賴關係。然而;我想截斷所有內容,以便ID等從1開始。 Rails 3有什麼方法嗎?用導軌控制檯截斷表格(s)
回答
接受的答案只有當你需要重新創建整個數據庫的工作。
要刪除一個表(與回調),並獲得的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}'")
只需在下一次測試運行時重建數據庫(這將在刪除後自動發生)。
rake db:drop RAILS_ENV=test
您也可以這樣做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.1.2 :001 > Post.all.each do |post|
2.1.2 :002 > post.destroy!
2.1.2 :003 > end
工作,以及...
這基本上遍歷所有帖子並銷燬它們。 (雖然我使用Rails 4)
1.不要使用'each',使用'find_each'。它確保您在一個查詢中不會得到十億條記錄 2.如果您需要從數據庫中刪除記錄(不需要運行任何回調),請不要使用循環。只要做'Post.delete_all' – Kukunin
這爲我工作>>> 的ActiveRecord :: Base的它不會改變你的自動遞增值,但...
同樣的邏輯也應該爲Rails 3以及工作。 connection.execute( 「TRUNCATE表格名」)
假設你使用MySQL或Postgre而不是SQLITE3(不支持TRUNCATE
),你可以做到以下幾點:
MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) }
注意,這將不調用ActiveRec ord回調。
- 1. 在控制檯上打印(導軌s)
- 2. 使用導軌控制檯
- 3. 寫入導軌控制檯
- 4. 導軌 - 通過控制檯
- 5. Rails控制檯截斷Activerecord輸出 - 如何防止截斷?
- 6. 停止Groovy控制檯截斷輸出?
- 7. 格式化Java控制檯表中斷
- 8. 導軌控制檯不起作用
- 9. 軌控制檯
- 10. 如何在非導軌項目中使用導軌控制檯?
- 11. 導軌遷移腳本VS控制檯
- 12. 更改導軌控制檯顏色
- 13. 導軌控制檯是否動態?
- 14. 從控制檯查看導軌測試
- 15. 從控制檯獲取導軌關聯
- 16. 退出導軌控制檯與'n'
- 17. 導軌控制檯(pry)和mongodb
- 18. 重新加載導軌控制檯
- 19. 無法打開導軌控制檯
- 20. 使用軌道控制檯
- 21. 在軌控制檯
- 22. 無法啓動導軌服務器或導軌控制檯
- 23. 無法啓動導軌服務器或導軌控制檯
- 24. 導軌控制檯無法在導軌中工作3.2.1
- 25. 導軌服務器工作但「導軌控制檯」不工作
- 26. 導軌3.2.6打開導軌控制檯錯誤
- 27. MySQL表格 - 截斷還是不截斷?
- 28. 使用LINQ截斷表格
- 29. 如何使用滑軌控制檯從表格中刪除列
- 30. 控制檯和JDBC中的十進制截斷/舍入差異
當一張桌子被截斷時,你的回答是正確的(我感謝你)我選擇了Yam Marcovic的答案作爲接受的答案,因爲我確實要求「所有」被截斷。 – CaptainCarl
感謝您的投票。問題的全部分貝要求並不明確!僅供參考,rake db:drop會丟棄數據庫。如果要求只是截斷所有表,你可以運行ActiveRecord :: Base.connection.tables.collect {| table_name | ActiveRecord :: Base.connection.execute(「TRUNCATE#{table_name}」)}。雖然它可能無法處理回調,但我想這不是必須的,因爲我們正在截斷所有的表。 –
destroy_all將在每條記錄上調用destroy,這與截斷表非常不同。來自文檔:#通過實例化每個 #記錄並調用其+ destroy +方法銷燬匹配條件+的記錄。每個對象的回調是 #執行(包括:依賴關聯選項和 #+ before_destroy +/+ after_destroy +觀察器方法)。返回已銷燬的對象集合 #每個將被凍結,至 #反映不應該做任何更改(因爲它們不能被 #保留)。 – justingordon