【问题标题】:Affected rows for ActiveRecord::Base.connection.executeActiveRecord::Base.connection.execute 的受影响行
【发布时间】:2014-12-18 17:40:29
【问题描述】:

使用 Rails 4.1.1,使用 mysql2 适配器:

我正在使用 ActiveRecord connection 在 MySQL 表中执行多次插入:

ActiveRecord::Base.connection.execute %Q{
    INSERT INTO table (`user_id`, `item_id`) 
    SELECT 1, id FROM items WHERE items.condition IS NOT NULL
}

这工作正常,完成工作,并返回nil

有没有办法获取受影响的行数? (避免需要执行另一个查询)

我发现execute 方法的文档有些稀疏。

【问题讨论】:

标签: mysql ruby-on-rails-4 activerecord connection


【解决方案1】:

您可以使用connection.update 方法执行表达式并返回受影响的行数。

ActiveRecord::Base.connection
  .update("INSERT INTO accounts (`name`) VALUES ('first'), ('second')")

=> 2

Rails v4.2.7 文档 - http://api.rubyonrails.org/v4.2.7/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-update

Rails 最新文档 - http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-update

【讨论】:

    【解决方案2】:

    这是一种使用 mysql2 适配器获取受影响行数的简单方法。将其放入您的应用加载的文件中:

    class ActiveRecord::ConnectionAdapters::Mysql2Adapter
      def affected_rows
        @connection.affected_rows
      end
    end
    

    然后您将能够运行ActiveRecord::Base.connection.affected_rows 以获取受影响的行数。

    【讨论】:

    • 像魅力一样工作。谢谢!
    • 多线程和连接池怎么样?可以确定受影响的行是从同一个连接返回的吗?
    • @akostadinov 当前线程是连接的唯一持有者,直到您将其重新检入池中。这就是连接池的全部意义所在。
    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2012-11-20
    • 2015-04-04
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多