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

我在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对象?

试试这个

 $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没有唯一索引,则此查询可能返回多行。 所以这种方法没那么有意义。 这只返回第一个匹配结果。

我会用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方法,在打印时puts会调用result