Problema de importação bizarro: consulta MySQL retorna PG::Result?

Isso está me deixando sem saída. Aqui está o 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 "Falha na conexão com o banco de dados, tentando novamente em 10 segundos"
        sleep 10
        puts "Hora de tentar novamente..."
        @client.query(sql, cache_rows: true)
      end
    end
  end

Os primeiros ~5 milhões de posts foram importados OK, mas agora, com bastante frequência,

        posts = mysql_query(query).to_a

retorna, não o resultado do MySQL, mas sim:

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

Acabei recorrendo a isso:

      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

Isso está detectando o problema e resolvendo, mas ainda falha em quase todas as consultas (às vezes, até 3 consultas de 5.000 registros são bem-sucedidas). Eu escrevi como um loop, mas acho que ele nunca é executado mais de uma vez. Por um momento, pensei que talvez algo mais estivesse usando @client e inserindo uma consulta PG nele, então mudei para @mysql_client, mas isso não resolveu.

Pesquisei um pouco no Google, mas não encontrei nada.

Meu “gambiarra” está funcionando, então imagino que esteja “consertado”, mas ainda tenho curiosidade sobre o que poderia estar causando isso.

Por quê?! Essa chamada reconecta ao Postgres e retorna o objeto PG::Result que você está vendo. Sua “gambiarra” apenas esconde o fato de que você está fazendo algo estúpido que não deveria fazer. :wink:

Acho que o que você realmente procura é a opção de conexão reconnect opção de conexão do cliente mysql2.

Aha! Então talvez seja culpa do meu código que deveria estar capturando erros do MySQL e tentando novamente. Eu achava que esse código já tinha funcionado anteriormente. E ainda parece que esqueço que uma função retorna o valor da última linha executada.

Muito obrigado, @gerhard. Vai levar pelo menos 15 minutos até eu ver o que vai acontecer a seguir, mas pelo menos agora entendi de onde vinha o retorno do PG!