返回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
。