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.