2009-07-28 21 views

答えて

70
rake db:reset 

移行からテーブルを再作成します。コメントで示唆したように

は、より高速な方法は、それを行うには(しかし、あなたは新しいrakeタスクを追加する必要があります)です:answer on SO

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 

応答からコピー。

+1

いいえ、私はすべてのテーブルを削除して再作成する必要がないメソッドを好むでしょう。 –

+2

テーブルの行を*ちょうど*削除するより速く正確な方法は、TRUNCATEコマンドを使うことです:http://stackoverflow.com/a/6332189/109618 –

+0

これは、実行しようとすると例外がスローされます。[sqlite TRUNCATEコマンドがありません](http://www.sqlite.org/lang.html)。 –

26

あなたはより微細な制御を持つことができます:あなたができるすべてのあなたの移行、

rake db:migrate 

を実行し

rake db:drop:all 

そして、移行を実行せずにデータベースを作成し、

rake db:create:all 

また:

あなたの代わりに、コマンドラインのコードからこれを実行しようとしている場合は0
mysqladmin drop databasename 
+0

'rake db:drop:all'はまさに私が探していたものです。ありがとう! – sivabudh

+4

'rake db:drop:all'は私のために本番データベースを削除しようとしました。 – vaughan

+2

__警告:__これにより、デフォルトの_development_環境にあるすべてのテーブルが削除されます。より細かい制御のために 'RAILS_ENV'環境変数を使用してください – Anwar

20

は、Test::Unit::TestCase#teardown方法から、あなたができると言うのいずれか

class MyTest < Test::Unit::TestCase 

    def teardown 
    ActiveRecord::Base.subclasses.each(&:delete_all) 
    end 

end 

または

class MyTest < Test::Unit::TestCase 

    def teardown 
    Rake::Task['db:reset'].invoke 
    end 

end 

私はあなたに警告

、しかし、どちらも 、特にが高速です。あなたができるならば、トランザクションテストを使うほうがはるかに良いでしょう。あなたは、単に空のテーブルの新鮮なセットで、新鮮な起動したい場合は

+1

Rails4でこれを試してみましたが、データが削除されていないことを忘れました – Besi

15

は、まずあなたがデシベル/ schema.rbのスキーマの最新の定義を持っていることを確認することができます

rake db:schema:dump 

rake db:schema:load 

テーブル全体を削除してから再作成すると、マイグレーション全体が実行されることはありません。

+0

すべてのマイグレーションを実行しました – juliangonzalez

2

これは古い質問ですが、これは誰かにとって参考になると思いました。これは、データベースからすべてのデータを消去する非常に高速な方法です。

tables = [] 
ActiveRecord::Base.connection.execute("show tables").each { |r| tables << r[0] } 
tables = tables - ["schema_migrations"] 
tables.each do |table| 
    ActiveRecord::Base.connection.execute("DELETE FROM #{table} WHERE 1 = 1") 
end 

このテクニックは、after(:all)ブロックの特定の仕様で使用します。これは、データベースをパージ、マイグレーション、リセットするためのRailsのレーキタスクよりもはるかに高速で効率的です。

ところで、私はデータベース側で外部キー制約を実施していた場合、これが失敗する可能性が高いと確信しています。

10

テーブルの行を削除するより速い方法は、TRUNCATEコマンドを使用することです。

他の回答の多くは、行の削除と表の削除の違いを無視しているようです。表をドロップすると、表のデータとスキーマが破棄されます。つまり、テーブルを再作成するための追加の手順が必要です。 Sean McLearyの答えは私が見た最高のものだったので、私はそれを出発点として使いました。しかし、TRUNCATEコマンドを利用する方が速いはずですが、自動インクリメントキーもリセットする方が良いと思います。また、eachの代わりにmapを使用すると、コードが少し短くなります。私たちは、database_cleaner gemに言及していないため、ここでスタックオーバーフローの怠慢だった

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 
+0

なぜ" schema_migrations "を削除しますか? – nurettin

+0

nurettin: 'schema_migrations'を削除することは厳密には必須ではありません。ただし、テーブルを切り捨てた後は、データを移行によってもはやナビゲートできない状態にしている可能性があります。したがって、 'schema_migrations'を削除すると、Railsは既知の状態からの移行を再開できます。 –

3

データベースクリーナーは、Rubyでデータベースを洗浄するための戦略のセットです。 元の使用例は、テスト中にクリーンな状態を確保することでした。各戦略 は少量のコードですが、データベースでテストしているRubyアプリ には通常必要なコードです。

「戦略」によって、Mabey氏は、切り捨て、トランザクション、および削除を意味します。

ActiveRecord、DataMapper、Sequel、MongoMapper、Mongoid、およびCouchPotatoがサポートされています。ここで

Database Cleaner READMEからの迅速なコードスニペットです:

require 'database_cleaner' 
DatabaseCleaner.strategy = :truncation 

# then, whenever you need to clean the DB 
DatabaseCleaner.clean 
3
# fast truncation of all tables that need truncations (select is 10x faster then truncate) 
# http://grosser.it/2012/07/03/rubyactiverecord-fastest-way-to-truncate-test-database/ 
def truncate_all_tables 
    connection = ActiveRecord::Base.connection 
    connection.disable_referential_integrity do 
    connection.tables.each do |table_name| 
     next if connection.select_value("SELECT count(*) FROM #{table_name}") == 0 
     connection.execute("TRUNCATE TABLE #{table_name}") 
    end 
    end 
end 
4

あなたはシード・ファイル(seeds.rb)内のすべてのモデルを一覧表示し、簡単に実行できる

rake db:seed 

シードファイルは次のようになります。

Model1.delete_all 
Model2.delete_all 
Model3.delete_all 
Model4.delete_all 
Model5.delete_all 
Model6.delete_all 
Model7.delete_all 

...

rake db:resetはあなたの仕事にはあまりにも多いです。それは完全にあなたのデータベースを殺し、最初からそれを再構築し、すべての移行などを実行します。シードコマンドを実行するには、より高速です。 PostgresのDBと

3

受け入れ答え:

namespace :db do 
    desc "Truncate all tables" 
    task :truncate => :environment do 
    conn = ActiveRecord::Base.connection 
    postgres = "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname='public'" 
    tables = conn.execute(postgres).map { |r| r['tablename'] } 
    tables.delete "schema_migrations" 
    tables.each { |t| conn.execute("TRUNCATE \"#{t}\"") } 
    end 
end 
4

これはRailsの4

(ActiveRecord::Base.connection.tables - ['schema_migrations']).each do |table| 
    table.classify.constantize.destroy_all 
end 
+0

これは私のためにうまくいきました.Rails 4、sqlite。きちんとしたトリック。ただし、ARモデルでバックアップされていないmany_to_manyテーブルが見つかった場合は、エラーが発生しました。 'schema_migrations'の場合と同じように、' tables'配列からこれを削除しなければなりませんでした。 –

1

デシベルと再び移行を実行することができ、洗浄のための私の50セント、(データベースを削除できない場合のケースでは、例えばAWS RDS):

# get connection 
conn = ActiveRecord::Base.connection 
# find all tables needed to be removed 
tables = conn.execute("SELECT * FROM pg_catalog.pg_tables WHERE schemaname='public' AND tablename<>'schema_migrations'").to_a.map { |r| r['tablename'] } 
# remove all tables except schema_migrations 
tables.each { |t| conn.execute("DROP TABLE #{t}") } 
# clean migrations table 
conn.execute("TRUNCATE TABLE schema_migrations") 

そして今、することができますデータベースをクリーンな状態にするにはrake db:migrateを実行してください。

2

、あなたのアプリケーションまたはレールコンソール内でそれを使用している間、テーブルに触れることなくデータのみを削除する場合:このコードで

Rails.application.eager_load! 
ActiveRecord::Base.connection.disable_referential_integrity do 
    ApplicationRecord.descendants.each do |model| 
    model.delete_all 
    end 
end 

を、手動でモデルを参照すると気にする必要はありませんし、 /または外部キーの制約(disable_referential_integrityのおかげで)。
ApplicationRecord.descendantsは、ActiveRecord :: Base.descendants(ApplicationRecord、schema_migrations、およびar_internal_metadataはこれ以上ありません)とは異なり、真のアプリケーションモデルのみを返します。

関連する問題