【问题标题】:Ruby MySQL output conflicting on different serversRuby MySQL输出在不同服务器上冲突
【发布时间】:2014-01-09 14:10:17
【问题描述】:

我在 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 我尝试了许多代码更改,并尝试将数据解析为它自己的变量,但似乎@987654327 @ 以单个变量的形式出现,因此无法解析为数组之类的东西,然后我可以使用它来正确发送数据。

在我的本地机器和专用服务器上这对我来说似乎很奇怪,因为我期望输出首先将 17 发送到 IRC,然后 Bob 喜欢:

17
Bob

对于所有的功能和来源,你可以查看我的 github /Ninjex/rubot,但是你可能需要安装一些 gem。

【问题讨论】:

  • 我为您创建了一个拉取请求,github.com/Ninjex/Rubot/pull/1,它公开了一些可用于简化代码的 ruby​​ 习惯用法。它并不完全是主题,但应该鼓励您更多地探索标准库。
  • 是的,我第一次使用 Ruby 编码时不熟悉的大多数习语。我承认我开始这个项目是在我刚接触 Ruby 时开始的,而且我来自 PHP 编程。然而,我不知道 Ruby 不需要 return 关键字,很好。感谢您的帮助,我期待在本周末修复大量多余的代码并转换为 mysql2。
  • 如果您还有任何问题,请联系我。我很乐意为您指明正确的方向。
  • 我非常感谢您在整个过程中的帮助!我觉得自己像个白痴,我终于找到了导致的问题。我已经在专用服务器上更新了我的 Ruby 版本,但我设法滑倒并没有将其配置为使用最新安装,所以它运行的是 1.08 而不是 1.9.3 一旦我更改了设置,它就像一个魅力。我非常感谢您的帮助。有什么方法可以让我就一些小问题与您联系,以推动我在编程方面更进一步,成为一名更好的程序员。感谢您一直以来的耐心等待!
  • 我为我们开了一个聊天室。让我知道这是否有效。

标签: mysql ruby dedicated-server


【解决方案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 中。也许它需要使用putsprint 之类的东西来确保每条消息后都有一个新行。您是否可能部署了不同版本的代码库?我还会在每个块中添加一个sleep 1,以确保这与您处理同时到达的消息无关。

【讨论】:

  • 谢谢,我实际上有这个特定的命令 (db_query) 作为管理功能,仅限我使用。 get_message 实际上是从另一个名为 send_data 的函数中提取的,该函数会删除各种 * 行(g、k、b 等)。一切都经过良好的消毒或相应的限制。我注意到我的本地机器是 32 位,而专用机器是 64 位。然而,在交互式 ruby​​ 会话中,除了正常情况外,两者都像我一样产生输出。我一定会检查每个安装的所有版本。还是很奇怪 imo。
  • 好的,我尝试了上面的方法:[1] pry(main)> results.class => Mysql::Result[2] pry(main)> results => #<Mysql::Result:0x7f42b20f5680> 我知道查询最终是 Mysql::Result 而不是实际的数组。回显数据的方法是通过result.each{|row| puts row} 或类似方法。睡觉也无济于事。我什至尝试创建一个新变量并将结果中的值连接到这个通过逗号分隔的变量,但没有运气。即使它来自两行,它也只是被解释为值。哼……
  • 你使用的是哪个 mysql gem?看起来您可以使用::as => :array 让查询返回一个数组。签出:github.com/brianmario/mysql2#usage
  • 那么,result.each{|row| puts row} 的输出是什么?行应该是一个数组,两个值将同时发送到通道。为了单独发送每个,您需要通过 row.each 遍历该行。
  • result.each{|row| puts row} 正在发送到终端,实际上是发送每个值以通过新的换行符分隔值。所以问题可能出在 chan_send 上,但这个函数从不操作文本,它只是将数据通过套接字推送到 IRC。我使用的是默认安装附带的默认 gem。但是,我可能会考虑使用 mysql2,因为这似乎是一个更好的选择,而且用途更广泛。
猜你喜欢
  • 2016-10-05
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2023-03-11
相关资源
最近更新 更多