Problema de importación extraño: consulta de MySQL devuelve PG::Result?

Esto me tiene desconcertado. Aquí está mysql_query:

  def mysql_query(sql)
    begin
      #puts "Consulta: \n#{sql}"
      @client.query(sql, cache_rows: true)
    rescue Exception => ex
      begin
        ActiveRecord::Base.connection.reconnect!
      rescue
        puts "Error en la conexión a la base de datos, reintentando en 10 segundos"
        sleep 10
        puts "Hora de reintentar..."
        @client.query(sql, cache_rows: true)
      end
    end
  end

Las primeras ~5 millones de publicaciones se importaron correctamente, pero ahora, con bastante frecuencia,

        posts = mysql_query(query).to_a

no devuelve el resultado de MySQL, sino esto:

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

He recurrido a esto:

      while !posts[-1].is_a?(Hash)
        puts "Publicaciones: #{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

Esto está detectando el problema y resolviéndolo, pero sigue fallando en casi cada consulta (a veces hasta 3 consultas de 5000 registros se ejecutan correctamente). Lo escribí como un bucle, pero creo que nunca se ejecuta más de una vez. Pensé brevemente que quizás algo más estaba usando @client e insertando una consulta PG en él, así que cambié a @mysql_client, pero eso no lo solucionó.

He buscado en Google un poco, pero no encontré nada.

Mi solución temporal está funcionando, así que supongo que está “arreglado”, pero sigo con curiosidad sobre qué podría estar causando esto.

¿Por qué?! Esa llamada se reconecta a Postgres y devuelve el objeto PG::Result que estás viendo. Tu truco solo oculta el hecho de que estás haciendo algo estúpido que no deberías hacer. :wink:

Supongo que lo que realmente buscas es la opción de conexión reconnect del cliente mysql2.

¡Aja! Así que quizás mi código, que supuestamente debería estar capturando errores de MySQL y reintentando, sea el culpable. Pensaba que ese código había funcionado anteriormente. Y todavía parece que olvido que una función devuelve el valor de la última línea que se ejecuta.

Mil gracias, @gerhard. Pasarán al menos 15 minutos antes de ver qué sucederá a continuación, pero al menos ahora entiendo de dónde provenía el retorno de PG.