Вопрос

Я написал бот 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, однако вам может потребоваться установить некоторые драгоценные камни.

Это было полезно?

Решение

Несколько примечаний:

  1. Убедитесь, что вы очищаете запрос через get_message.Или вы открываете себя для чего-то серьезного проблемы безопасности.
  2. Убедитесь, что вы используете одни и те же версии драгоценного камня MySQL, Ruby и MySql.Различия в любом из них могут изменить ожидаемый результат.
  3. Если вы зашли в тупик и не можете решить основную проблему, вы всегда можете отправить собственный разделитель и использовать его для разделения.К сожалению, это испортит корпус, который действительно работает, и его придется разбирать.

Вот как я бы подошел к отладке проблемы на выделенной машине:

def db_query
 que = get_sanitized_message
 results = @con.query(que)
 require 'pry'
 binding.pry

 results.each {|x| chan_send(x)}
end
  1. Добавить поддеть драгоценный камень в ваш Gemfile или gem install pry.
  2. Обновите свой код для использования pry:см. выше
  3. Это откроет консоль любопытства, когда binding.pry строка нажата, и вы можете опросить почти все в работающем приложении.
  4. я бы взглянул на results и посмотрите, является ли это массивом.Просто введите results в консоли, и он распечатает значение.Также напечатайте results.class.Возможно, запрос возвращает какой-то специальный объект набора результатов, который не является массивом, но имеет метод доступа к массиву результатов.
  5. Если results является массивом, то проблема, скорее всего, в chan_send.Возможно, нужно использовать что-то вроде puts против print чтобы гарантировать наличие новой строки после каждого сообщения.Возможно ли, что у вас развернуты разные версии вашей кодовой базы?Я бы еще добавил sleep 1 внутри каждого блока, чтобы гарантировать, что это не связано с обработкой сообщений, поступающих в одно и то же время.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top