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.

War es hilfreich?

Lösung

Ein paar Anmerkungen:

  1. Stellen Sie sicher, dass Sie die Abfrage über bereinigen get_message.Oder Sie öffnen sich für etwas Ernstes Sicherheitsprobleme.
  2. 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.
  3. 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
  1. Ergänzen Sie die Juwel aufhebeln zu Ihrem Gemfile, oder gem install pry.
  2. Aktualisieren Sie Ihren Code zur Verwendung pry:siehe oben
  3. Dadurch wird eine Hebelkonsole geöffnet, wenn die binding.pry Zeile wird erreicht und Sie können fast alles in Ihrer laufenden Anwendung abfragen.
  4. Ich würde einen Blick darauf werfen results und prüfen Sie, ob es sich um ein Array handelt.Schreib einfach results in der Konsole und der Wert wird ausgedruckt.Auch austippen results.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.
  5. Wenn results ist ein Array, dann liegt das Problem höchstwahrscheinlich in chan_send.Vielleicht muss es so etwas wie verwenden puts vs print 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ügen sleep 1 innerhalb jedes Blocks, um sicherzustellen, dass dies nicht mit Ihrer Verarbeitung gleichzeitig eintreffender Nachrichten zusammenhängt.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top