奇妙なインポート問題 -- 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 件レコードのクエリが成功することもあります)。ループとして書きましたが、実際には 1 回しか実行されていないように思います。一時的に、別のプロセスが @client を使用して PG クエリを混入させているのではないかと考え、@mysql_client に切り替えましたが、それでは解決しませんでした。

少しググってみましたが、情報は見つかりませんでした。

このハックは機能しているので「解決済み」とは言えますが、いったい何がこのような現象を引き起こしているのか、まだ気になっています。

なぜですか?!その呼び出しは Postgres に再接続し、表示されている PG::Result オブジェクトを返します。あなたのハックは、あなたが 愚か してはいけないことをしているという事実を隠しているだけですよ。:wink:

おそらく、あなたが本当に探しているのは、mysql2 クライアントの reconnect 接続オプション でしょう。

なるほど!つまり、MySQL のエラーを捕捉して再試行するはずの私のコードが原因かもしれません。そのコードは以前は機能していたと思っていたのですが。それに、関数は実行された最後の行の値を返すというのを、まだ忘れがちです。
@gerhard さん、本当にありがとうございます。次に何が起こるかは少なくとも 15 分後にならないと分かりませんが、少なくとも PG の戻り値がどこから来ていたのかは理解できました!