Problème d'importation bizarre : requête MySQL renvoyant PG::Result ?

Cela me laisse perplexe. Voici mysql_query :

  def mysql_query(sql)
    begin
      #puts "Requête : \n#{sql}"
      @client.query(sql, cache_rows: true)
    rescue Exception => ex
      begin
        ActiveRecord::Base.connection.reconnect!
      rescue
        puts "Échec de la connexion à la base de données, nouvelle tentative dans 10 secondes"
        sleep 10
        puts "Temps pour réessayer. . . "
        @client.query(sql, cache_rows: true)
      end
    end
  end

Les ~5 premiers millions de publications importées ont fonctionné correctement, mais maintenant, assez souvent,

        posts = mysql_query(query).to_a

ne renvoie pas le résultat MySQL, mais plutôt :

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

Je suis donc passé à ceci :

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

Cela permet de détecter et de résoudre le problème, mais il échoue encore sur presque chaque requête (parfois jusqu’à 3 requêtes de 5 000 enregistrements réussissent). Je l’ai écrit comme une boucle, mais je pense qu’elle ne s’exécute jamais plus d’une fois. J’ai brièvement pensé que quelque chose d’autre utilisait @client et insérait une requête PG dedans, alors j’ai changé pour @mysql_client, mais cela n’a pas résolu le problème.

J’ai fait quelques recherches sur Google, mais sans succès.

Mon hack fonctionne, donc je suppose que c’est « résolu », mais je suis toujours curieux de savoir ce qui pourrait bien causer cela.

Pourquoi ? ! Cet appel se reconnecte à Postgres et renvoie l’objet PG::Result que vous voyez. Votre astuce ne fait que masquer le fait que vous faites quelque chose de stupide que vous ne devriez pas faire. :wink:

Je suppose que ce que vous cherchez vraiment, c’est l’option de connexion reconnect du client mysql2.

Ah ! Donc, peut-être que mon code censé attraper les erreurs MySQL et réessayer est en cause. Je pensais que ce code avait déjà fonctionné. Et j’oublie toujours qu’une fonction renvoie la valeur de la dernière ligne exécutée.

Merci infiniment, @gerhard. Il faudra au moins 15 minutes avant de voir ce qui va se passer ensuite, mais au moins, je comprends maintenant d’où venait le retour PG !