Ruby MySQL 出力が異なるサーバー上で競合する
-
21-12-2019 - |
質問
Github (/ninjex/rubot) にある Ruby IRC ボットをコーディングしましたが、購入したばかりの専用サーバー上の MySQL と競合する出力が発生しています。
まず、MySQL フォルダー (.gitignore 内) にデータベースへの接続があり、次のコード ブロックのようになります。
@con = Mysql.new('localhost', 'root', 'pword', 'db_name')
次に、データベースにクエリを実行する実際の関数があります。
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
ローカル マシンでコマンドを実行すると、次のようになります。
./db_query SELECT amount, user from words WHERE user = 'Bob' and word = 'hello'
IRC で出力を配列のような形式で受け取ります。 ["17", "Bob"]
ここで、17 は金額、Bob はユーザーです。
ただし、これと同じ関数を専用サーバーで使用すると、次のような出力が得られます。 17Bob
コードに多くの変更を加えたり、データを解析して独自の変数に入れたりしようとしましたが、 17Bob
単一の変数として出力されるため、データを正しく送信するために使用できる配列のようなものに解析することが不可能になります。
これは、ローカルマシンと専用サーバーの両方で奇妙に思えます。出力では、最初に 17 を IRC に送信し、次に Bob に次のように送信されると予想していたためです。
17
Bob
すべての関数とソースについては、私の github /Ninjex/rubot をチェックしてください。ただし、いくつかの gem をインストールする必要がある場合があります。
解決
いくつかのメモ:
- クエリをサニタイズしていることを確認してください
get_message
. 。あるいは、あなたは深刻な問題に心を開いています セキュリティの問題. - 同じバージョンの mysql gem、ruby、および MySql を使用していることを確認してください。これらのいずれかが異なると、予想される出力が変わる可能性があります。
- 途方に暮れて根本的な問題を解決できない場合は、いつでもカスタム区切り文字を送信し、それを使用して分割できます。残念ながら、実際に機能しているケースが台無しになってしまうため、取り外す必要があります。
専用マシンで問題をデバッグする方法は次のとおりです。
def db_query
que = get_sanitized_message
results = @con.query(que)
require 'pry'
binding.pry
results.each {|x| chan_send(x)}
end
- を追加します。 宝石をこじ開ける Gemfile に追加するか、または
gem install pry
. - 使用するコードを更新してください
pry
:上記を参照 - これにより、
binding.pry
行がヒットすると、実行中のアプリケーションのほぼすべてを調べることができます。 - 見てみましょう
results
そしてそれが配列かどうかを確認します。入力するだけresults
コンソールで値を出力します。こちらも入力してくださいresults.class
. 。クエリが配列ではなく、結果配列にアクセスするメソッドを備えた特別な結果セット オブジェクトを返している可能性があります。 - もし
results
が配列の場合、問題はおそらく次の場所にあります。chan_send
. 。おそらく、次のようなものを使用する必要がありますputs
対print
各メッセージの後に必ず改行が入るようにするためです。異なるバージョンのコードベースがデプロイされている可能性はありますか?また、sleep 1
各ブロック内で、これが同時に到着するメッセージの処理に関連していないことを確認します。
所属していません StackOverflow