2014-01-09 3 views
0

Я закодировал бот IRI Ruby, который находится на github (/ ninjex/rubot), который имеет некоторый конфликтный вывод с MySQL на выделенном сервере, который я только что приобрел.Ошибка Ruby 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 в a Array like fashion: ["17", "Bob"] Где 17 - сумма, а Bob - пользователь.

Однако, используя эту же функцию на моем выделенных результатах сервера в выходе, как: 17Bob я пытался много изменений в коде, а также попытаться проанализировать эти данные в своем собственные переменный, однако, кажется, что 17Bob приходит как единую переменную, что делает невозможным синтаксический анализ в виде массива, который я мог бы использовать для правильной отправки данных.

Это кажется странным, как на моей локальной машине и выделенный сервер, как я ожидал, что выход на первый отправить 17 в IRC, а затем Боб, как:

17 
Bob 

Для всех функций и источника вы можете проверить мой github/Ninjex/rubot, однако вам может потребоваться установить некоторые драгоценные камни.

+0

Я создал запрос на вытягивание, https://github.com/Ninjex/Rubot/pull/1, для вас, который предоставляет некоторые рубиновые идиомы, которые вы можете использовать для упрощения кода. Это не совсем по теме, но должно побудить вас изучить стандартную библиотеку еще немного. –

+0

Да, большинство идиом, с которыми я не знаком с первым кодированием в Ruby. Я признаю, что начал этот проект, когда Ruby был для меня новичком, и я пришел из программирования, тяжелого в PHP. Я, однако, не знал, что Ruby не нуждается в ключевом слове return, nice. Спасибо за вашу помощь, я с нетерпением жду исправления большого количества лишнего кода и преобразования в mysql2 в эти выходные. – Singularity

+0

Убей меня, если у тебя есть еще вопросы. Я был бы рад указать вам в правильном направлении. –

ответ

1

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

  1. Убедитесь, что вы дезинфицировать запрос через get_message. Или вы открываете себя до серьезного security problems.
  2. Убедитесь, что вы используете одни и те же версии mysql gem, 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. Добавьте pry gem к вашему Gemfile или gem install pry.
  2. Обновить код использовать pry: смотрите выше
  3. Это откроет консоль монтировки, когда binding.pry линия ударило, и вы можете опрашивать почти все в вашем запущенном приложении.
  4. Я бы посмотрел на results и посмотрел, если это массив. Просто введите results в консоли и распечатает значение. Также введите results.class.Возможно, что запрос возвращает какой-то специальный объект набора результатов, который не является массивом, но имеет метод доступа к массиву результатов.
  5. Если results - это массив, то проблема, скорее всего, в chan_send. Возможно, он должен использовать что-то вроде puts vs print, чтобы убедиться, что после каждого сообщения появляется новая строка. Возможно ли, что у вас разные версии вашей кодовой базы? Я бы также добавил sleep 1 в каждом блоке, чтобы гарантировать, что это не связано с обработкой сообщений, поступающих в одно и то же время.
+0

Спасибо, у меня есть эта конкретная команда (db_query) как функция администратора, которая ограничена только для моего использования. get_message фактически вытягивает из другой функции, называемой send_data, которая разделяет все виды * строк (g, k, b и т. д.). Все тщательно очищается или ограничено. Мне было доведено до сведения, что мой локальный компьютер 32bit, а выделенный - 64 бит. Однако, когда в интерактивном рубиновом сеансе оба вывода выводятся, как обычно, Я обязательно проверю все версии каждой установки. Все еще очень странное имо. – Singularity

+0

Хорошо, я попытался выше: '' [1] монтировка (основной)> results.class => Mysql :: Result'' '' [2] монтировка (основной)> Результаты => # < Mysql :: Результат: 0x7f42b20f5680> '' Я знал, что запрос заканчивается как Mysql :: Result, а не фактический массив. Способ эхо-вывода данных - через '' result.each {| row | помещает строку} '' или аналогичную. спать не помогает ни одному. Я даже попытался создать новую переменную и объединить значения в результате этой переменной, разделенной запятыми, не повезло. Это просто интерпретируется как значение, даже если оно состоит из двух строк. Hmph ... – Singularity

+0

Какой тип mysql вы используете? Похоже, вы можете запросить возврат массива, используя: ': as =>: array'. Проверьте: https://github.com/brianmario/mysql2#usage –

Смежные вопросы