【问题标题】:Deleting all records in a database table删除数据库表中的所有记录
【发布时间】:2011-07-16 09:22:08
【问题描述】:

如何在 Ruby on Rails 应用程序中删除我的一个数据库表中的所有记录?

【问题讨论】:

    标签: ruby-on-rails ruby database ruby-on-rails-3


    【解决方案1】:

    如果您的模型名为 BlogPost,则为:

    BlogPost.all.map(&:destroy)
    

    【讨论】:

    • 这将获取每一个 BlogPost 并在销毁它们之前将其加载到 Ruby 数组中。
    • 取决于 ORM。 Datamapper 不会那样做,因为您没有要求关于每个模型的任何内容。这是一个 Mongoid 堆栈跟踪,显示它在销毁每个条目之前没有选择任何字段: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)
    • 因为这是一个rails问题,并且提问者没有说他使用的是哪个ORM,我们应该假设ActiveRecord
    【解决方案2】:

    如果您正在寻找一种不使用 SQL 的方法,您应该能够使用 delete_all。

    Post.delete_all
    

    或有条件

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

    更多信息请参见here

    记录在没有先加载的情况下被删除,这使其速度非常快,但会破坏计数器缓存等功能,该功能取决于删除时要执行的 Rails 代码。

    【讨论】:

    • 值得注意的是,如果你与 :dependent => :destroy 有关联,或者任何需要在删除时清理的东西,你可能会想要 Post.destroy_all - 虽然它很多慢点。见apidock.com/rails/ActiveRecord/Base/destroy_all/class
    • 这个答案假设表有一个与之关联的模型。 OP 没有指定这一点 - 如果表是连接表怎么办?
    • @BradWerth 不管它被某些人认为是好还是坏的风格,我只是说 Rails 数据库有不是ActiveRecord 模型的表是可行的。该问题询问有关从“表”中删除记录的问题,我只是指出或答案中的假设。
    • 我的查询与@Toby1Kenobi 的相同。
    【解决方案3】:

    如果您想完全清空数据库,而不仅仅是删除一个或多个附加到它的模型,您可以这样做:

    rake db:purge
    

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

    rake db:test:purge
    

    【讨论】:

      【解决方案4】:

      通过 SQL 删除

      Item.delete_all # accepts optional conditions

      通过调用每个模型的destroy方法来删除(昂贵但确保调用回调)

      Item.destroy_all # accepts optional conditions

      全部here

      【讨论】:

        【解决方案5】:
        BlogPost.find_each(&:destroy)
        

        【讨论】:

        • 这对于内存不足的情况非常有用。
        • 这是唯一考虑内存消耗的答案。
        • 天啊,为什么要为此循环...没有意义。只需删除所有记录 DELETE FROM 表,Model.delete_all
        • @John 为什么一个查询比一个循环的查询消耗更多的内存?
        • @Imnl 每次迭代都会实例化一个相关模型的新实例,以便它可以处理删除方法的回调。
        【解决方案6】:

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

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

        【讨论】:

        • 当您需要在块内使用 if 表达式时首选 select,这样您就不必链接紧凑方法来删除 nil 元素。
        【解决方案7】:

        如果您想删除每个表中的每个条目,则提供最新答案:

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

        更多关于eager_loadhere的信息。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-29
          • 1970-01-01
          • 1970-01-01
          • 2019-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多