【问题标题】:ruby/sql syntax undefined method `query' for nil:NilClass (NoMethodError)ruby/sql 语法未定义方法“查询”,用于 nil:NilClass (NoMethodError)
【发布时间】:2016-07-09 17:07:23
【问题描述】:

我不断收到以下错误消息:

.rb:215:in block in collectData': undefined methodquery' for nil:NilClass (NoMethodError)

这是我的代码:

databases = {
  'aaa': Mysql2::Client.new(
      host:     '',
      username: '',
      password: '',
      database: ''
    ),
  'bbb': 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 = databases[row['db']]
    row2 = next_db.query("SELECT...")

我从我的第一个 sql 查询中获取数据库的名称 client1.query,例如 row['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 ")

我似乎无法理解为什么我的方法是“未定义的”。

请帮忙,

谢谢!

【问题讨论】:

    标签: mysql sql ruby


    【解决方案1】:

    所以你有你的数据库哈希,你想根据第一个数据库查询的结果查询下一个数据库......

    基本上你的代码是对的,只是你从不检查nil。在这种情况下,无论row['db'] 返回什么,在databases 散列中都找不到匹配的数据库。我将假设这是一个需要修复的异常。

    所以...

    # 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
    

    【讨论】:

    • 我仍然得到同样的错误“数据库aaa未定义”,我用上面的答案解决了这个问题,谢谢。
    • @AlexBrickman 哎呀,使用了错误的哈希语法...现在已修复
    • 冒号将键转换为符号,因此databases[row['db']] 正在返回 nil,因为它试图通过字符串而不是符号来查找数据库。
    【解决方案2】:

    尝试将数据库的哈希更改为:

    databases = {
       'aaa' => Mysql2::Client.new(host: '', username: '', password: '', database: ''),
       'bbb' => Mysql2::Client.new(host: '',username: '', password: '', database: '')
     }

    【讨论】:

    • 它的作品!但是为什么使用 => 而不是 : ,有人可以解释一下吗?
    • 请参阅@br3nt 解释。
    【解决方案3】:

    您的客户端实例不像您的工作示例那样位于 client 变量中,而是位于哈希中。错误的原因是您试图在具有 nil 值的变量上调用 query 方法。

    您应该适当地访问您的客户:

    databases['aaa'].query("
      ").each do |row|
                if row['mmm'] == 99
                  # Look in next db
                    next_db = client
                    row2 = next_db.query("
                    SELECT " )
    

    当然,要实现您的目标逻辑,有必要在执行这些步骤时遍历数据库哈希。

    【讨论】:

    • 谢谢,但我需要通过我从第一个 sql 查询中获得的名称来访问数据库,row['db'] 可以是 aaa 或 bbb。
    • 我想通过我从第一个查询中获得的名称访问 aaa 和 bbb。
    • 然后编写一个递归函数,每一步都使用databases中包含的相应客户端。这方面与您收到答案的原始问题无关。
    • 我在这里寻求帮助,我该怎么做,因为即使我做这样的事情 "next_db = databases['aaa']" 它也不起作用。
    猜你喜欢
    • 2016-06-15
    • 2013-02-17
    • 2014-03-16
    • 2023-03-06
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多