我在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对象?
答案 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
方法,puts
在result
打印时调用该方法。