奇怪的导入问题——Mysql 查询返回 PG::Result?

这让我很困惑。这是 mysql_query 的代码:

  def mysql_query(sql)
    begin
      #puts "Query: \n#{sql}"
      @client.query(sql, cache_rows: true)
    rescue Exception => ex
      begin
        ActiveRecord::Base.connection.reconnect!
      rescue
        puts "数据库连接失败,10 秒后重试"
        sleep 10
        puts "准备重试..."
        @client.query(sql, cache_rows: true)
      end
    end
  end

前约 500 万条帖子导入正常,但现在,很多时候:

        posts = mysql_query(query).to_a

返回的不是 MySQL 结果,而是:

 [#<PG::Result:0x0000563f3ee6d8d0 status=PGRES_COMMAND_OK ntuples=0 nfields=0 cmd_tuples=0>]

我被迫采用了以下方法:

      while !posts[-1].is_a?(Hash)
        puts "Posts: #{posts}"
        ActiveRecord::Base.connection.reconnect!
        @mysql_client = Mysql2::Client.new(
          host: DB_HOST,
          username: DB_USER,
          password: DB_PW,
          database: DB_NAME
        )
        posts = mysql_query(query).to_a
      end

这确实捕获了问题并解决了它,但几乎每次查询都会失败(有时甚至连续 3 次包含 5000 条记录的查询能成功)。我把它写成了循环,但我认为它从未运行超过一次。我一度怀疑是否有其他进程在使用 @client 并向其中插入了 PG 查询,于是我改用 @mysql_client,但这并没有解决问题。

我搜索了一下,但一无所获。

我的临时方案奏效了,所以我想算是“修复”了,但我仍然好奇这究竟是什么原因造成的。

为什么?!该调用会重新连接到 Postgres,并返回你看到的 PG::Result 对象。你的变通方法只是掩盖了你正在做 愚蠢的 不该做的事情这一事实。:wink:

我想你真正需要的是 mysql2 客户端的 reconnect 连接选项

啊哈!看来问题可能出在我原本用来捕获 MySQL 错误并重试的代码上。我本以为那段代码之前是有效的。而且我似乎又忘了:函数会返回最后一条执行语句的值。

非常感谢,@gerhard。至少需要 15 分钟我才能看到接下来会发生什么,但至少我现在明白 PG 的返回值是从哪里来的了!