返回sqlite3 gem的#execute和#query方法的值

时间:2017-01-29 09:17:15

标签: ruby sqlite rubygems

我在sqlite3 gem的帮助下使用ruby中的sqlite3数据库(我试图更好地理解使用sqlite3 gem而不使用ActiveRecords)。我在下面有一个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对象?

2 个答案:

答案 0 :(得分: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没有唯一索引,则此查询可能会返回多行。所以这种方法没有多大意义。这只会返回第一个匹配结果。

答案 1 :(得分:1)

我会使用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方法,putsresult打印时调用该方法。