Sortie Ruby MySQL en conflit sur différents serveurs
-
21-12-2019 - |
Question
J'ai codé un bot Ruby IRC qui se trouve sur github (/ninjex/rubot) et qui a des sorties conflictuelles avec MySQL sur un serveur dédié que je viens d'acheter.
Tout d'abord nous avons la connexion à la base de données dans le dossier MySQL (en .gitignore) qui ressemble au bloc de code suivant.
@con = Mysql.new('localhost', 'root', 'pword', 'db_name')
Ensuite, nous avons une véritable fonction pour interroger la base de données
def db_query
que = get_message # Grabs query from user i.e,./db_query SELECT * FROM words
results = @con.query(que) # Send query through the connection i.e, @con.query("SELECT * FROM WORDS")
results.each {|x| chan_send(x)} # For each row returned, send it to the channel via
end
Sur ma machine locale, lors de l'exécution de la commande :
./db_query SELECT amount, user from words WHERE user = 'Bob' and word = 'hello'
Je reçois le résultat dans IRC sous la forme d'un tableau : ["17", "Bob"]
Où 17 est le montant et Bob est l'utilisateur.
Cependant, l'utilisation de cette même fonction sur mon serveur dédié donne un résultat du type : 17Bob
J'ai tenté de nombreuses modifications dans le code et essayé d'analyser les données dans sa propre variable, mais il semble que 17Bob
se présente sous la forme d'une variable unique, ce qui rend impossible l'analyse en quelque chose comme un tableau, que je pourrais ensuite utiliser pour envoyer les données correctement.
Cela me semble étrange à la fois sur ma machine locale et sur le serveur dédié, car je m'attendais à ce que la sortie envoie d'abord 17 à l'IRC, puis à Bob comme :
17
Bob
Pour toutes les fonctions et sources, vous pouvez consulter mon github /Ninjex/rubot, mais vous devrez peut-être installer quelques gemmes.
La solution
Quelques remarques :
- Assurez-vous de nettoyer la requête via
get_message
.Ou vous vous ouvrez à des choses sérieuses problèmes de sécurité. - Assurez-vous que vous utilisez les mêmes versions de MySQL Gem, Ruby et MySql.Les différences dans l’un de ces éléments peuvent modifier le résultat attendu.
- Si vous êtes à bout de nerfs et ne parvenez pas à résoudre le problème sous-jacent, vous pouvez toujours envoyer un délimiteur personnalisé et l'utiliser pour diviser.Malheureusement, cela gâcherait le boîtier qui fonctionne réellement et devra être démonté.
Voici comment j'aborderais le débogage du problème sur la machine dédiée :
def db_query
que = get_sanitized_message
results = @con.query(que)
require 'pry'
binding.pry
results.each {|x| chan_send(x)}
end
- Ajouter le levier gemme à votre Gemfile, ou
gem install pry
. - Mettez à jour votre code pour l'utiliser
pry
:voir au dessus - Cela ouvrira une console de levier lorsque le
binding.pry
la ligne est atteinte et vous pouvez interroger presque tout dans votre application en cours d'exécution. - j'y jetterais un oeil
results
et voyez si c'est un tableau.Tapez simplementresults
dans la console et il imprimera la valeur.Tapez égalementresults.class
.Il est possible que la requête renvoie un objet de jeu de résultats spécial qui n'est pas un tableau, mais qui possède une méthode pour accéder au tableau de résultats. - Si
results
est un tableau, alors le problème vient probablement dechan_send
.Peut-être qu'il faut utiliser quelque chose commeputs
contreprint
pour vous assurer qu'il y a une nouvelle ligne après chaque message.Est-il possible que différentes versions de votre base de code soient déployées ?J'ajouterais également unsleep 1
dans chaque bloc pour garantir que cela n'est pas lié à votre gestion des messages arrivant en même temps.