Вывод Ruby MySQL конфликтует на разных серверах
-
21-12-2019 - |
Вопрос
Я написал бот Ruby IRC, который находится на GitHub (/ninjex/rubot), который имеет некоторые конфликтующие выходные данные с 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 — сумма, а Боб — пользователь.
Однако использование этой же функции на моем выделенном сервере приводит к следующему выводу: 17Bob
Я попытался внести множество изменений в код, а также попытаться проанализировать данные в собственной переменной, однако кажется, что 17Bob
выходит как одна переменная, что делает невозможным синтаксический анализ в нечто вроде массива, который я затем мог бы использовать для правильной отправки данных.
Мне это кажется странным как на моей локальной машине, так и на выделенном сервере, поскольку я ожидал, что выходные данные сначала отправят 17 в IRC, а затем Боб типа:
17
Bob
Все функции и исходный код вы можете найти на моем github/Ninjex/rubot, однако вам может потребоваться установить некоторые драгоценные камни.
Решение
Несколько примечаний:
- Убедитесь, что вы очищаете запрос через
get_message
.Или вы открываете себя для чего-то серьезного проблемы безопасности. - Убедитесь, что вы используете одни и те же версии драгоценного камня MySQL, 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
внутри каждого блока, чтобы гарантировать, что это не связано с обработкой сообщений, поступающих в одно и то же время.