Railsの単一のテーブルをリセットする方法は?


回答:


27

SQLiteでインデックス/主キーをリセットするには、次のように入力します。

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")

1
...あなたの答えからインスピレーションを取るPerson.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye

1
誰かがこれを試し、エラーが発生した場合、私はActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")それを実行しましたsqlite_sequence where name = 'yourtablename' is not a valid table name
l1zZY 2015

184

テーブル内のすべてのデータを削除する方法を見つけるために、多くの人(私のような)がここに来ます。どうぞ:

$ rails console

> ModelName.delete_all

または

> ModelName.destroy_all

destroy_allは依存関係とコールバックをチェックし、少し時間がかかります。delete_allはストレートSQLクエリです。

詳細はこちら:http//apidock.com/rails/ActiveRecord/Base/delete_all/class


14
このソリューションは、テーブルエントリをリセットしますが、主キーはリセットしません。
ジャスティンD.

4
ええ、これは素晴らしいです-しかし、私はインデックスをリセットしたいです!delete_allもdestroy_allもインデックスを1にリセットしていません。–
Kyle Clegg

この回答は、それに到達した大多数のユーザーの質問を解決しました。それが本当に重要なことです。それに加えて、それが唯一の答えではなく、正しいものとしてフラグが立てられていません。著者はまた彼の意図を説明した。ですから問題はありません。
エディソンマシャド2018

45

Railsコンソールから以下を使用してテーブル内のすべてを削除してから、インデックスカウンターをリセットしました(Ruby 2&Rails 4):

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')

3
これは私にとっては非常にうまく機能しましたmodel_nameが、モデルの単数形の名前ではなく、テーブルの実際の名前のように、resetコマンドで複数形にする必要があるということです。
エリデューク

シンボリックバージョンでも機能しActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name)ます:。
Chris Cirefice 2018

18

@khelllのリンクは役に立ちます。1つのテーブルを切り捨てるコマンドは次のとおりです。

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")

16

Rails 4.2以降truncateActiveRecord接続で直接使用できます。

ActiveRecord::Base.connection.truncate(:table_name)

これは、すべてのデータをワイプし、自動インクリメントカウンタをリセットし、テーブルに。MySQLとPostgresで動作しますが、Sqliteでは動作しません


10

gem 'database_cleaner'Gemfileに追加し、を実行してから、次のようにします$ bundle install

> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])

より多くのテーブルを指定できます。

> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])

最後のパラメーターを省略すると、データベース全体が切り捨てられます。

> DatabaseCleaner.clean_with(:truncation) # your database is truncated

6

Rails4.2.0とSqlite3を使用しています

これが私のために働いたものです(上記のすべてから少し取ってください):

$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")

その後、インデックスを1から始めて、テーブルに新しいレコードを追加することができました。


1

データベースがPostgresのときにこの質問への回答を探している他の人は、Railsコンソールからこれを行うことができます。

rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")

ここaccountsで、accounts_id_seqはテーブルの名前です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.