【问题标题】:Return Values of #execute and #query methods of sqlite3 gemsqlite3 gem的#execute和#query方法的返回值
【发布时间】:2017-06-14 15:07:13
【问题描述】:

我在 sqlite3 gem 的帮助下在 ruby​​ 中使用 sqlite3 数据库(我试图在不使用 ActiveRecords 的情况下更好地理解使用 sqlite3 gem)。我在下面有一个 sql 查询:

SELECT id FROM contacts WHERE first_name = 'Charles'

我希望它从中返回值“5”

执行

$db.execute('SELECT id FROM contacts WHERE first_name = ?', 'Charles') do |result|
  puts result
end

上面将打印“5”,但会返回一个 sqlite3 对象。我似乎无法让execute 方法返回值'5'。

查询

$db.query('SELECT id FROM contacts WHERE first_name = ?', 'Charles') do |result|
  result.first.first
end

我能得到的最接近的方法是使用query 方法返回值“5”(上图),但这需要.first.first,这似乎很复杂。

有没有更好的方法让我获得所需的价值?即也许通过访问 sqlite3 对象?

【问题讨论】:

    标签: ruby sqlite rubygems


    【解决方案1】:

    试试这个

    $db.results_as_hash = true
    $db.execute('SELECT id FROM contacts WHERE first_name = ?', 'Charles') do |row|
      puts row['id']
    end
    

    你想要一个方法。制作类似的东西

    def find_id_by_first_name(first_name)
      $db.results_as_hash = true
      $db.execute('SELECT id FROM contacts WHERE first_name = ?', first_name) do |row|
        return row['id']
      end
    end
    

    但无论如何,您的查询可能有问题。如果first_name 没有唯一索引,则此查询可能返回多行。所以这种方法没有多大意义。这只是返回第一个匹配结果。

    【讨论】:

    • 那行不通。我收到一个错误:TypeError: no implicit conversion of String into Integer
    • 你有没有执行过$db.results_as_hash = true这一行?
    • 好的,启用results_as_hash 后不再返回错误。 puts 工作正常,但我希望将值 '5' 返回 而不是打印出来。我该怎么办?
    【解决方案2】:

    我会使用to_i:

    $db.execute('SELECT id FROM contacts WHERE first_name = ?', 'Charles') do |result|
      puts result.to_i
    end
    

    之所以需要调用to_i是因为sqlite gem不知道返回值的数据类型。例如,要识别数据类型,需要对表定义进行另一个查询。这是 sqlite gem 不会像 ActiveRecord 这样的 ORM 为您做的事情。

    顺便说一句。您会找到puts 在相同文件中也返回值的原因,因为定义了一个to_s 方法,该方法在打印时由result 上的puts 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2019-04-11
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多