У меня есть следующий sqlite-код в качестве отдельного файла.Оно работает.схема является базовой.foo.db
таблица bar
Id
, Text
, Value
, Etc
- мои столбцы
#!/usr/bin/env ruby
require 'sqlite3'
puts "enter a number"
input = gets.chomp.to_i
begin
db = SQLite3::Database.open('foo.db')
find_data = db.execute2 "select * from bar where Value = #{input}"
find_data.each do |f|
puts "[%-8s] %-8s | %-8s" % [f[1], f[2], f[3]]
end
rescue SQLite::Exception => e
puts e
ensure
db.close if db
end
execute2
находит строку и find_data.each
выводит на печать.
Однако, когда я беру приведенный выше фрагмент и помещаю его в метод в более крупной программе, в моем методе получается «нет такого столбца: [input]»
. Я сжал код :
...
def find_info(info)
begin
db = SQLite3::Database.open('foo.db')
puts db.get_first_value "select SQLite_VERSION()"
return "create a directory first" unless File.exist?('foo.db')
#line below does not work at print_out below
print_out = db.execute2 "SELECT * FROM Bar WHERE Value=#{info}"
#but making the following changes works:
#info_in = info; print_out = db.execute2 "select * from BAR WHERE Value = :info_in", info_in
return "no match" unless print_out != nil
print_out.each do |line|
puts "[%-8s] %-8s | %-8s" % [line[1], line[2], line[3]]
end
rescue SQLite3::Exception => e
puts e
ensure
db.close if db
end
end
...
print 'enter text to search for'
info = gets.chomp.to_s
X.NewInstance.new; X.find_info(info)
Мой вопрос: Почему я обязан использовать заполнитель в print_out
? Полагаю, я могу просто добавить переменную как print_out = db.execute2 "select * from Bar WHERE Value=#{info}"
, пожалуйста, помогите. Я ошеломлен.
(Также: на SO должен быть способ сделать отступы для блоков кода наиболее эффективно, чем использовать 4 пробела для каждой строки кода ... Я трачу большевремя форматирования кода, чем я набираю вопрос ... пожалуйста, посоветуйте?)