2014-04-22 94 views
4

我需要刪除數據庫中的所有表而不刪除數據庫,因爲此數據庫的用戶沒有創建數據庫特權。rake db:reset刪除所有表,但不刪除數據庫

刪除所有表但不是實際數據庫的最佳方法是什麼?

此外,我們使用rake db:seed添加一些條目到一個表中,所以我不想使用種子文件。

+0

是否需要通過rake任務完成它?爲什麼不只是生成一個遷移來刪除表? –

+0

刪除所有表的目的是爲了讓我清除數據庫,以便爲測試目的做一個乾淨的設置。理想情況下,我會使用db:reset,但我的數據庫管理員不給我一個可以重新創建數據庫的帳戶。 –

+0

現在還不清楚是否要將數據放入表格或表格本身。請提供更多數據。 –

回答

7

所有表這是我最終與看截斷方法後,想出瞭解決方案。

namespace :db do 
    desc "Erase all tables" 
    task :clear => :environment do 
    conn = ActiveRecord::Base.connection 
    tables = conn.tables 
    tables.each do |table| 
     puts "Deleting #{table}" 
     conn.drop_table(table) 
    end 
    end 
end 
+1

如果有外鍵引用表,它似乎會破壞:( – Hut8

+0

這可能很容易擴展到查看引用其他表的表並首先清除它們,然後清除剩下的部分,也可以非常容易地更新它來清除單個表格,而不是一次清除所有表格。 –

0

你可以做到這一點有以下rake任務(這是我很久以前這裏)

namespace :db do 
    desc "Truncate all tables" 
    task :truncate => :environment do 
    conn = ActiveRecord::Base.connection 
    tables = conn.execute("show tables").map { |r| r[0] } 
    tables.delete "schema_migrations" 
    tables.each { |t| conn.execute("TRUNCATE #{t}") } 
    end 
end 

編輯爲鏈接添加到我發現的問題之前:

Delete everything from all tables (in Activerecord)

我不明白爲什麼要刪除所有表,如果truncate指令也重新啓動你的表。

不管怎樣,也許這答案可能也有幫助:

https://stackoverflow.com/a/2789515/1639291

https://stackoverflow.com/a/1197218/1639291

+0

這是否實際刪除每個表或只刪除每個表中的所有行? –

+0

只截取表格。這不是你想要的嗎? :| – JGutierrezC

+0

我需要刪除所有表,但離開數據庫。然後,我將運行rake:migrate來重新創建所有表。 –

0

如果運行rake -P | grep db你會看到所有內置的Rails的數據庫任務,但他們都不做你在找什麼。我相信唯一的方法就是使用遷移。 This answer告訴你如何。

2

進行測試,我會建議使用:

rake db:test:prepare 

它會重新生成基於您db/schema.rb