Mysql nil:NilClass(NoMethodError)的ruby/sql语法未定义的方法“query”
我一直收到以下错误消息: .rb:215:collectData中的块中:nil:NilClass NoMethodError的“未定义的方法查询” 这是我的代码: 数据库={ “aaa”:Mysql2::Client.new 主持人:, 用户名:, 密码:, 数据库: , “bbb”:Mysql2::Client.new 主持人:, 用户名:, 密码:, 数据库: } client1.query bla bla bla.each do|行| 如果行['mmm']==99 查看下一个数据库 next_db=数据库[行['db']] row2=下一个\u db.querySELECT。。。 我从第一个sql查询client1.query中获取数据库的名称,例如行['db']=aaa或bbb 对于测试,类似的内容也不起作用:Mysql nil:NilClass(NoMethodError)的ruby/sql语法未定义的方法“query”,mysql,sql,ruby,Mysql,Sql,Ruby,我一直收到以下错误消息: .rb:215:collectData中的块中:nil:NilClass NoMethodError的“未定义的方法查询” 这是我的代码: 数据库={ “aaa”:Mysql2::Client.new 主持人:, 用户名:, 密码:, 数据库: , “bbb”:Mysql2::Client.new 主持人:, 用户名:, 密码:, 数据库: } client1.query bla bla bla.each do|行| 如果行['mmm']==99 查看下一个数据库 ne
client1.query(" bla bla bla").each do |row|
if row['mmm'] == 99
# Look in next db
next_db = databases['aaa']
row2 = next_db.query("SELECT...")
像这样的工作:
client1 = Mysql2::Client.new(
host: '',
username: '',
password: '',
database: ''
)
client2 = Mysql2::Client.new(
host: '',
username: '',
password: '',
database: ''
)
client1.query(" bla bla bla").each do |row|
if row['mmm'] == 99
# Look in next db
next_db = client2
row2 = next_db.query("SELECT ")
我似乎不明白为什么我的方法没有定义
请帮忙
谢谢 您的客户机实例不像您的工作示例那样驻留在客户机变量中,而是驻留在散列中。出现错误的原因是您试图对具有nil值的变量调用query方法 您应该适当地访问您的客户:
databases['aaa'].query("
").each do |row|
if row['mmm'] == 99
# Look in next db
next_db = client
row2 = next_db.query("
SELECT " )
当然,为了实现您的目标逻辑,在执行步骤时必须遍历数据库哈希。因此,您拥有数据库哈希,并且希望根据第一次数据库查询的结果查询下一个数据库 基本上,你的代码是正确的,除非你从来没有检查为零。在这种情况下,无论第['db']行返回什么,在数据库哈希中都找不到匹配的数据库。我将假设这是一个需要修复的异常 所以
尝试将数据库哈希更改为: 数据库={ “aaa”=>Mysql2::Client.newhost:,用户名:,密码:,数据库:, 'bbb'=>Mysql2::Client.newhost:,用户名:,密码:,数据库:
}谢谢,但是我需要通过我从第一个sql查询中获得的名称访问数据库,行['db']可以是aaa或bbb。我想通过我从第一个查询中获得的名称访问aaa和bbb。然后编写一个递归函数,每个步骤使用数据库中包含的相应客户端。这一方面与您收到答案的原始问题无关。我在这里询问是为了获得一些帮助,我应该如何做,因为即使我这样做,next_db=databases['aaa']也不起作用。它起作用了!但是为什么用=>而不是:,有人可以解释吗?请看@br3nt解释。我仍然得到相同的错误数据库aaa没有定义,我用上面的答案修复了这个错误,谢谢。@AlexBrickman oops,对哈希使用了错误的语法。。。现在已修复冒号正在将键转换为符号,因此数据库[row['db']]返回nil,因为它试图通过字符串而不是符号查找数据库。
# hash of databases
databases = {
'aaa' => Mysql2::Client.new(host: '', username: '', password: '', database: ''),
'bbb' => Mysql2::Client.new(host: '',username: '', password: '', database: '')
}
# get the first database
client1 = databases['aaa']
# perform the query
client1.query("bla bla bla").each do |row|
if row['mmm'] == 99
# look in next db
client2 = databases[row['db']]
if (client2)
row2 = client2.query("SELECT...")
else
raise "Database `#{row['db']}` is not defined."
end
end
end