Ruby MySQL 输出在不同服务器上发生冲突
-
21-12-2019 - |
题
我在 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
我尝试了对代码的许多更改,并尝试将数据解析为它自己的变量,但是似乎 17Bob
作为单个变量出现,使得无法解析为数组之类的东西,然后我可以使用它来正确发送数据。
在我的本地计算机和专用服务器上,这对我来说似乎很奇怪,因为我期望输出首先将 17 发送到 IRC,然后 Bob 像这样:
17
Bob
对于所有功能和来源,您可以查看我的 github /Ninjex/rubot,但是您可能需要安装一些 gem。
解决方案
一些注意事项:
- 确保您正在通过以下方式清理查询
get_message
. 。或者你正在向一些严肃的事情敞开心扉 安全问题. - 确保您使用相同版本的 mysql gem、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
在每个块中,以确保这与您处理同时到达的消息无关。
不隶属于 StackOverflow