2012-11-01 12 views
30

私はこのテスト用データベースを持っていますが、今はジャンクで詰まっています。今、私はいくつかのTable.destroy_allコマンドをレールコンソールで実行しました。これはすばらしいすべてのレコードと依存関係を削除します。しかしながら;私はIDの等が再び1で始まるようにすべてを切り捨てたいと思います。 Rails 3には何か方法がありますか?テーブルをレールコンソールで切り捨てます

答えて

104

受け入れ答えにのみ機能します。

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

あなたはSQLiteにも使用している場合、それはそう、次の操作を行いTRUNCATEをサポートしていません:

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}'") 
(コールバック付き)単一のテーブルをドロップすると、IDは1から開始するために取得する
+2

1つのテーブルを切り捨てる必要があります(そして私はそれに感謝します)私は切り捨てられるように "すべて"を求めていたので、受け入れられた答えとしてYam Marcovicの答えを選択しました。 – CaptainCarl

+4

投票ありがとうございます。全体のdb要件は、質問から明らかではなかった!ちょうど情報のために、rake db:dropはデータベースを落とします。要件がすべてのテーブルを切り捨てるだけであれば、ActiveRecord :: Base.connection.tables.collect {| table_name | ActiveRecord :: Base.connection.execute( "TRUNCATE#{table_name}")}。コールバックの世話をしないかもしれませんが、私はすべてのテーブルを切り捨てるので必要ではないと思います。 –

+0

destroy_allは各レコードでdestroyを呼び出しますが、これはテーブルを切り捨てるのとはまったく異なります。 From documents:# #レコードをインスタンス化し、+ destroy +メソッドを呼び出すことによって+条件+に一致するレコードを破棄します。各オブジェクトのコールバックは #実行されます(:従属するの関連オプションと、 #+ before_destroy +/after_destroy + Observerメソッドを含む)。破棄されたオブジェクトのコレクション# を返します。それぞれ #に変更を加える必要がないことを反映して固定されます( #は保存されていないため)。 – 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

これを行うことで、重要なDATAを失うことになります。 –

0

(少し遅れてパーティーに、私が知っている)

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

...

この本質的にすべてのポストをループして破棄します。

これは私のために働いた
+2

1. 'each'を使わず、' find_each'を使います。 1つのクエリで10億のレコードを取得しないようにします。 2. DBからレコードを削除するだけでコールバックを実行する必要がない場合は、ループを使用しないでください。 'Post.delete_all'を実行してください – Kukunin

4

>>> はActiveRecord ::ベース(私はRailsの4を使用していますが)これは、しかし...

同じロジックが同様のRails 3のために働く必要がありますあなたの自動インクリメント値を変更しません。これはということ

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

注:connection.execute( "TRUNCATE table_nameの")

1

あなたはMySQLやPostgreなくsqlite3のを(TRUNCATEをサポートしていない)を使用していると仮定すると、あなたは次のことを行うことができますActiveRecを呼び出さないordコールバック。

関連する問題