Странная проблема импорта -- запрос 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 "Database connection failed, retrying in 10 seconds"
        sleep 10
        puts "Time to retry. . . "
        @client.query(sql, cache_rows: true)
      end
    end
  end

Первые ~5 млн записей импортировались нормально, но теперь довольно часто:

        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

Это позволяет отловить проблему и решить её, но запросы всё равно падают почти каждый раз (иногда удаётся выполнить до трёх запросов по 5000 записей подряд). Я написал это как цикл, но, кажется, он никогда не выполняется более одного раза. Коротко я подумал, что, возможно, кто-то другой использует @client и помещает туда запрос PG, поэтому я переключился на @mysql_client, но это не помогло.

Я немного погуглил, но ничего не нашёл.

Мой хак работает, так что, видимо, проблема «решена», но мне всё ещё интересно, что именно может вызывать такое поведение.

Зачем?! Этот вызов переподключается к Postgres и возвращает объект PG::Result, который вы видите. Ваш хак лишь скрывает тот факт, что вы делаете что-то глупое, чего не следует делать. :wink:

Похоже, что вы на самом деле ищете опцию подключения reconnect опции подключения клиента mysql2.

Ага! Значит, возможно, виноват мой код, который должен перехватывать ошибки MySQL и повторять попытку. Я думал, что этот код уже работал ранее. И я всё ещё забываю, что функция возвращает значение последней выполненной строки.

Огромное спасибо, @gerhard. Пройдёт как минимум 15 минут, прежде чем я увижу, что произойдёт дальше, но хотя бы теперь я понимаю, откуда взялся возврат PG!