Ruby MySQL输出在不同的服务器上冲突

时间:2014-01-09 14:10:17

标签: mysql ruby dedicated-server

我编写了一个Ruby IRC bot,它位于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作为单个变量出现,使得无法解析为数组之类的东西,然后我可以使用它来正确地发送数据。

在我的本地计算机和专用服务器上,这对我来说似乎很奇怪,因为我期望输出首先向IRC发送17然后像Bob那样:

17
Bob

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

1 个答案:

答案 0 :(得分:1)

一些注意事项:

  1. 确保您通过get_message清理查询。或者你正在打开一些严肃的security problems
  2. 确保您使用的是相同版本的mysql gem,ruby和MySql。任何这些差异都可能会改变预期的产出。
  3. 如果您处于智慧结束且无法解决根本问题,您可以随时发送自定义分隔符并使用它进行拆分。不幸的是,它会破坏实际工作的情况并且需要被剥离。
  4. 以下是我在专用机器上调试问题的方法:

    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行被点击时,这将打开一个pry控制台,您可以查询正在运行的应用程序中的几乎所有内容。
    4. 我会看看results,看看它是否是一个数组。只需在控制台中键入results,它就会打印出值。同时输入results.class。查询可能返回一些特殊的结果集对象,该对象不是数组,但有一个访问结果数组的方法。
    5. 如果results是一个数组,则问题最有可能出现在chan_send中。也许它需要使用puts vs print之类的东西来确保每条消息后都有一个新行。是否可能部署了不同版本的代码库?我还会在每个块中添加sleep 1,以确保这与您对同时到达的邮件的处理无关。