すべての投稿を削除するにはPost.delete_all
できますが、すべての投稿、コメント、ブログなどを削除したい場合はどうすればよいですか?Railsのすべてのテーブルからすべてのデータを削除するには?
すべてのモデルを反復処理してdelete_all
メソッドを実行するにはどうすればよいですか?
すべての投稿を削除するにはPost.delete_all
できますが、すべての投稿、コメント、ブログなどを削除したい場合はどうすればよいですか?Railsのすべてのテーブルからすべてのデータを削除するには?
すべてのモデルを反復処理してdelete_all
メソッドを実行するにはどうすればよいですか?
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
応答からコピー。
あなたはより微細な制御を持つことができます:あなたができるすべてのあなたの移行、
rake db:migrate
を実行し
rake db:drop:all
そして、移行を実行せずにデータベースを作成し、
rake db:create:all
また:
あなたの代わりに、コマンドラインのコードからこれを実行しようとしている場合は0mysqladmin drop databasename
は、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
私はあなたに警告
、しかし、どちらも 、特にが高速です。あなたができるならば、トランザクションテストを使うほうがはるかに良いでしょう。あなたは、単に空のテーブルの新鮮なセットで、新鮮な起動したい場合はRails4でこれを試してみましたが、データが削除されていないことを忘れました – Besi
は、まずあなたがデシベル/ schema.rbのスキーマの最新の定義を持っていることを確認することができます
rake db:schema:dump
と
rake db:schema:load
テーブル全体を削除してから再作成すると、マイグレーション全体が実行されることはありません。
すべてのマイグレーションを実行しました – juliangonzalez
これは古い質問ですが、これは誰かにとって参考になると思いました。これは、データベースからすべてのデータを消去する非常に高速な方法です。
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のレーキタスクよりもはるかに高速で効率的です。
ところで、私はデータベース側で外部キー制約を実施していた場合、これが失敗する可能性が高いと確信しています。
テーブルの行を削除するより速い方法は、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
なぜ" schema_migrations "を削除しますか? – nurettin
nurettin: 'schema_migrations'を削除することは厳密には必須ではありません。ただし、テーブルを切り捨てた後は、データを移行によってもはやナビゲートできない状態にしている可能性があります。したがって、 'schema_migrations'を削除すると、Railsは既知の状態からの移行を再開できます。 –
:
データベースクリーナーは、Rubyでデータベースを洗浄するための戦略のセットです。 元の使用例は、テスト中にクリーンな状態を確保することでした。各戦略 は少量のコードですが、データベースでテストしているRubyアプリ には通常必要なコードです。
「戦略」によって、Mabey氏は、切り捨て、トランザクション、および削除を意味します。
は Database Cleaner READMEからの迅速なコードスニペットです:ActiveRecord、DataMapper、Sequel、MongoMapper、Mongoid、およびCouchPotatoがサポートされています。ここで
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
# then, whenever you need to clean the DB
DatabaseCleaner.clean
# 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
あなたはシード・ファイル(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と
受け入れ答え:
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
これはRailsの4
(ActiveRecord::Base.connection.tables - ['schema_migrations']).each do |table|
table.classify.constantize.destroy_all
end
これは私のためにうまくいきました.Rails 4、sqlite。きちんとしたトリック。ただし、ARモデルでバックアップされていないmany_to_manyテーブルが見つかった場合は、エラーが発生しました。 'schema_migrations'の場合と同じように、' tables'配列からこれを削除しなければなりませんでした。 –
rake db:purge
にも動作しますが、最近レール4.2のmasterブランチでのActiveRecordに追加されました。 0。アルファ
https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d
デシベルと再び移行を実行することができ、洗浄のための私の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
を実行してください。
、あなたのアプリケーションまたはレールコンソール内でそれを使用している間、テーブルに触れることなくデータのみを削除する場合:このコードで
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はこれ以上ありません)とは異なり、真のアプリケーションモデルのみを返します。
いいえ、私はすべてのテーブルを削除して再作成する必要がないメソッドを好むでしょう。 –
テーブルの行を*ちょうど*削除するより速く正確な方法は、TRUNCATEコマンドを使うことです:http://stackoverflow.com/a/6332189/109618 –
これは、実行しようとすると例外がスローされます。[sqlite TRUNCATEコマンドがありません](http://www.sqlite.org/lang.html)。 –