Strano problema di importazione: la query MySQL restituisce PG::Result?

Questo mi ha lasciato perplesso. Ecco 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 "Connessione al database fallita, riprovo tra 10 secondi"
        sleep 10
        puts "Tempo per riprovare..."
        @client.query(sql, cache_rows: true)
      end
    end
  end

I primi ~5 milioni di post importati correttamente, ma ora, abbastanza spesso,

        posts = mysql_query(query).to_a

restituisce, non il risultato MySQL, bensì:

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

Ho ricorso a questo:

      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

E questo sta rilevando il problema e risolvendolo, ma continua a fallire su quasi ogni query (a volte fino a 3 query da 5000 record riescono). L’ho scritta come un ciclo, ma credo che non venga eseguita più di una volta. Ho pensato brevemente che forse qualcos’altro stesse usando @client e inserendo una query PG, quindi sono passato a @mysql_client, ma ciò non ha risolto il problema.

Ho cercato su Google, ma non ho trovato nulla.

Il mio workaround funziona, quindi immagino sia “risolto”, ma sono ancora curioso di sapere cosa potrebbe causare questo problema.

Perché?! Questa chiamata si riconnette a Postgres e restituisce l’oggetto PG::Result che stai vedendo. Il tuo trucco nasconde solo il fatto che stai facendo qualcosa di stupido che non dovresti fare. :wink:

Immagino che quello che stai cercando sia l’opzione di connessione reconnect del client mysql2.

Ah, ecco! Quindi forse è colpa del mio codice che dovrebbe intercettare gli errori di MySQL e riprovare. Pensavo che quel codice avesse funzionato in precedenza. E continuo a dimenticare che una funzione restituisce il valore dell’ultima riga eseguita.

Grazie mille, @gerhard. Ci vorranno almeno 15 minuti prima di vedere cosa succederĂ  dopo, ma almeno ora capisco da dove proveniva il ritorno di PG!