Ruby, MySQL salida de conflicto en diferentes servidores
-
21-12-2019 - |
Pregunta
Yo he programado un Rubí bot de IRC que está en github (/ninjex/rubot) que está teniendo algunos conflicto de salida con MySQL en un servidor dedicado que acabo de comprar.
En primer lugar tenemos la conexión a la base de datos en la carpeta de MySQL (en .gitignore), que es similar al siguiente bloque de código.
@con = Mysql.new('localhost', 'root', 'pword', 'db_name')
A continuación, tenemos una función real para la consulta de la base de datos
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
En mi máquina local, cuando se ejecuta el comando:
./db_query SELECT amount, user from words WHERE user = 'Bob' and word = 'hello'
Yo recibir la salida en el canal de IRC en una Matriz como la moda: ["17", "Bob"]
Donde el 17 es la cantidad y Bob es el usuario.
Sin embargo, usando esta misma función en mi servidor dedicado resultados en una salida como: 17Bob
He intentado muchos cambios en el código, así como tratar de analizar los datos en su propia variable, sin embargo parece que 17Bob
está saliendo como una sola variable, lo que hace imposible analizar en algo así como una matriz, que yo podría utilizar para enviar los datos correctamente.
Esto parece extraño para mí, tanto en mi máquina local y el servidor dedicado, como yo estaba esperando la salida de enviar en primer lugar 17 de la IRC y, a continuación, Bob como:
17
Bob
Para todas las funciones y de código fuente puede comprobar mi github /Ninjex/rubot, sin embargo, puede que tenga que instalar algunas joyas.
Solución
Un par de notas:
- Asegúrese de desinfectar consulta a través de
get_message
.O están abriendo a algunos graves los problemas de seguridad. - Asegúrese de que está utilizando las mismas versiones de mysql joya, ruby y MySql.Las diferencias en cualquiera de estos puede alterar el resultado esperado.
- Si usted está en su final de ingenio y son incapaces de resolver la cuestión de fondo, siempre se puede enviar una costumbre delimitador y se usa para dividir.Desafortunadamente, va a simular el caso de que realmente está funcionando y necesita ser arrancadas.
Esto es lo que yo haría con enfoque de depuración de la cuestión en el equipo dedicado:
def db_query
que = get_sanitized_message
results = @con.query(que)
require 'pry'
binding.pry
results.each {|x| chan_send(x)}
end
- Agregar el haga palanca joya a su Gemfile, o
gem install pry
. - Actualizar el código a utilizar
pry
:ver arriba - Esto abrirá una palanca de la consola cuando la
binding.pry
la línea es golpeado y se puede interrogar a casi todo en su aplicación en ejecución. - Me gustaría echar un vistazo a
results
y a ver si es una matriz.Justo el tipo deresults
en la consola y se imprimirá el valor.También el tipo de salidaresults.class
.Es posible que la consulta se devuelve algún resultado particular objeto de conjunto que no es un array, pero que tiene un método para acceder a la matriz de resultados. - Si
results
es una matriz, entonces el problema es más probable enchan_send
.Quizá se necesite el uso de algo comoputs
vsprint
para garantizar que hay una nueva línea después de cada mensaje.Es posible que se tienen diferentes versiones de su código a implementar?También me gustaría añadir unsleep 1
dentro de cada bloque para asegurarse de que esto no está relacionado con su manejo de los mensajes que llegan al mismo tiempo.