使用rails控制台截断表

时间:2012-11-01 08:42:35

标签: ruby-on-rails ruby-on-rails-3 truncate rails-console

我有这个测试数据库,到目前为止,已经塞满了垃圾。现在我在rails控制台中完成了一些Table.destroy_all命令,这些命令删除了很棒的所有记录和依赖项。然而;我想截断所有内容,以便ID等等再次从1开始。在Rails 3中有什么办法吗?

11 个答案:

答案 0 :(得分:126)

只有在需要重新创建整个数据库时,才能使用已接受的答案 删除单个表(使用回调)并从1开始获取ID:

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

如果您使用的是Sqlite,则它不支持截断,请执行以下操作:

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}'")

答案 1 :(得分:12)

这对我有用 -     ActiveRecord::Base.connection.execute("TRUNCATE table_name")

答案 2 :(得分:5)

Model.connection.truncate(Model.table_name)

答案 3 :(得分:2)

只需在下次测试运行时重建数据库(这将在删除后自动发生)。

rake db:drop RAILS_ENV=test

答案 4 :(得分:2)

你也可以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文件从它的迁移数据。

答案 5 :(得分:1)

rake db:reset将执行rake db:drop db:setup。换句话说,删除数据库并再次设置数据库。

Source

答案 6 :(得分:1)

假设您使用的是MySQL或Postgre而不是SQlite3(不支持TRUNCATE),您可以执行以下操作:

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

请注意,这不会调用ActiveRecord回调。

答案 7 :(得分:0)

我使用下面的代码截断所有表

ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.tables.each do |table|
  next if table == 'schema_migrations'

  case ActiveRecord::Base.connection.adapter_name.downcase.to_sym
    when :mysql2 , :postgresql
      ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
      ActiveRecord::Base.connection.execute("TRUNCATE #{table} RESTART IDENTITY")
    when :sqlite
      ActiveRecord::Base.connection.execute("DELETE FROM #{table}")
  end
end

答案 8 :(得分:0)

Rails 6.0+ 添加新方法:truncate_tables

ActiveRecord::Base.connection.truncate_tables([:table1_name, :table2_name])

https://stackoverflow.com/a/68618256/7438710

答案 9 :(得分:-2)

如果要截断所有内容并仅使用模式从新的数据库开始,请执行以下操作:

RAILS_ENV=test rake db:schema:load

(这不会触发您的ActiveRecord模型回调)

答案 10 :(得分:-4)

(我知道派对有点晚了)

要求在控制台中执行此操作:

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

也适用......

这基本上会遍历所有帖子并销毁它们。它虽然不会改变你的自动增量值...

相同的逻辑也适用于Rails 3(尽管我使用的是Rails 4)