Ruby MySQL-Ausgabe steht auf verschiedenen Servern in Konflikt
-
21-12-2019 - |
Frage
Ich habe einen Ruby-IRC-Bot codiert, der sich auf Github (/ninjex/rubot) befindet und der auf einem dedizierten Server, den ich gerade gekauft habe, widersprüchliche Ausgaben mit MySQL hat.
Zuerst haben wir die Verbindung zur Datenbank im MySQL-Ordner (in .gitignore), die dem folgenden Codeblock ähnelt.
@con = Mysql.new('localhost', 'root', 'pword', 'db_name')
Dann haben wir eine tatsächliche Funktion zum Abfragen der Datenbank
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
Auf meinem lokalen Computer, wenn ich den Befehl ausführe:
./db_query SELECT amount, user from words WHERE user = 'Bob' and word = 'hello'
Ich erhalte die Ausgabe im IRC in einer Array-ähnlichen Weise: ["17", "Bob"]
Dabei ist 17 der Betrag und Bob der Benutzer.
Die Verwendung derselben Funktion auf meinem dedizierten Server führt jedoch zu einer Ausgabe wie: 17Bob
Ich habe viele Änderungen am Code versucht und auch versucht, die Daten in eine eigene Variable zu analysieren, aber es scheint so 17Bob
wird als einzelne Variable ausgegeben, was es unmöglich macht, sie in etwas wie ein Array zu analysieren, das ich dann zum korrekten Senden der Daten verwenden könnte.
Das erscheint mir sowohl auf meinem lokalen Rechner als auch auf dem dedizierten Server seltsam, da ich erwartet hatte, dass die Ausgabe zuerst 17 an den IRC sendet und dann Bob wie folgt:
17
Bob
Alle Funktionen und Quellen finden Sie in meinem Github /Ninjex/rubot. Möglicherweise müssen Sie jedoch einige Gems installieren.
Lösung
Ein paar Anmerkungen:
- Stellen Sie sicher, dass Sie die Abfrage über bereinigen
get_message
.Oder Sie öffnen sich für etwas Ernstes Sicherheitsprobleme. - Stellen Sie sicher, dass Sie dieselben Versionen von MySQL Gem, Ruby und MySQL verwenden.Unterschiede in diesen Punkten können die erwartete Ausgabe verändern.
- Wenn Sie nicht mehr weiter wissen und das zugrunde liegende Problem nicht lösen können, können Sie jederzeit ein benutzerdefiniertes Trennzeichen senden und es zum Teilen verwenden.Leider wird dadurch das eigentlich funktionierende Gehäuse beschädigt und muss ausgebaut werden.
So würde ich das Problem auf dem dedizierten Computer beheben:
def db_query
que = get_sanitized_message
results = @con.query(que)
require 'pry'
binding.pry
results.each {|x| chan_send(x)}
end
- Ergänzen Sie die Juwel aufhebeln zu Ihrem Gemfile, oder
gem install pry
. - Aktualisieren Sie Ihren Code zur Verwendung
pry
:siehe oben - Dadurch wird eine Hebelkonsole geöffnet, wenn die
binding.pry
Zeile wird erreicht und Sie können fast alles in Ihrer laufenden Anwendung abfragen. - Ich würde einen Blick darauf werfen
results
und prüfen Sie, ob es sich um ein Array handelt.Schreib einfachresults
in der Konsole und der Wert wird ausgedruckt.Auch austippenresults.class
.Es ist möglich, dass die Abfrage ein spezielles Ergebnismengenobjekt zurückgibt, das kein Array ist, aber über eine Methode für den Zugriff auf das Ergebnisarray verfügt. - Wenn
results
ist ein Array, dann liegt das Problem höchstwahrscheinlich inchan_send
.Vielleicht muss es so etwas wie verwendenputs
vsprint
um sicherzustellen, dass nach jeder Nachricht eine neue Zeile steht.Ist es möglich, dass Sie unterschiedliche Versionen Ihrer Codebasis bereitgestellt haben?Ich würde auch eine hinzufügensleep 1
innerhalb jedes Blocks, um sicherzustellen, dass dies nicht mit Ihrer Verarbeitung gleichzeitig eintreffender Nachrichten zusammenhängt.