删除数据库表中的所有记录


Answers:


249

如果您正在寻找不使用SQL的方法,则应该可以使用delete_all。

Post.delete_all

或有条件

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

有关更多信息,请参见此处

删除记录时无需先加载它们,这使其非常快,但会破坏诸如计数器缓存之类的功能,该功能取决于删除时要执行的rails代码。


13
值得注意的是,如果您具有与:dependent =>:destroy的关联,或者在删除时需要清除的任何内容,则可能会需要Post.destroy_all-尽管速度要慢得多。参见apidock.com/rails/ActiveRecord/Base/destroy_all/class
Michael Hellein 2011年

该答案假定该表具有与之关联的模型。OP没有指定此内容-如果表是联接表怎么办?
Toby 1 Kenobi

1
@BradWerth,无论是否有人认为它是好是坏,我只是说Rails db包含不是ActiveRecord模型的表是可行的。问题是要从“表”中删除记录,而我只是指出答案中的假设或假设。
Toby 1 Kenobi

我和@ Toby1Kenobi的查询相同。
nbsamar

30

通过SQL删除

Item.delete_all # accepts optional conditions

通过调用每个模型的destroy方法进行删除(价格昂贵,但要确保调用了回调函数)

Item.destroy_all # accepts optional conditions

全部在这里


21

如果您想完全清空数据库,而不仅仅是删除一个或多个附加的模型,则可以执行以下操作:

rake db:purge

你也可以在测试数据库上做

rake db:test:purge

5

如果您的意思是删除所有模型的每个实例,我将使用

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)

1
select无论何时需要在块中使用if表达式,都应优先使用,这样可以避免必须链接紧凑方法来删除nil个元素。
塞巴斯蒂安·帕尔马

4
BlogPost.find_each(&:destroy)

这对于内存不足的情况非常有用。
Epigene

这是唯一考虑内存消耗的答案。
约翰·约翰(John John)

2
天哪,为什么要为此循环……没有意义。只需删除所有记录DELETE FROM table,Model.delete_all
Imnl

@John为什么一个查询比一个查询循环消耗更多的内存?
Imnl

@Imnl每次迭代都会实例化所讨论模型的新实例,以便它可以处理delete方法的回调。
约翰

2

如果您的模型称为BlogPost,则将是:

BlogPost.all.map(&:destroy)

这将获取每个BlogPost并将其加载到Ruby数组中,然后销毁它们。
hdgarrood13年

取决于ORM。Datamapper不会这样做,因为您不需要任何有关每个模型的信息。这是一个Mongoid stacktrace,显示它在销毁每个条目之前未选择任何字段:MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
stef 2013年

4
由于这是一个Rails问题,并且询问者还没有说出他使用的是哪个ORM,我们应该假设使用ActiveRecord
hdgarrood13年

2

如果要删除每个表中的每个条目,请提供最新的答案:

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

有关eager_load 此处的更多信息。

调用它之后,我们可以访问的所有后代,ActiveRecord::Base并且可以delete_all在所有模型上应用a 。

请注意,我们确保不要清除SchemaMigration表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.