Mysql nil:NilClass(NoMethodError)的ruby/sql语法未定义的方法“query”

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

我一直收到以下错误消息:

.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

对于测试,类似的内容也不起作用:

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