sqlite3 .execute2 зацепиться за рубиновый файл - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть следующий 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 пробела для каждой строки кода ... Я трачу большевремя форматирования кода, чем я набираю вопрос ... пожалуйста, посоветуйте?)

1 Ответ

0 голосов
/ 24 февраля 2019

В этом случае не удается выполнить интерполяцию строки.Заполнители могут быть использованы.

print_out = db.execute2 "select * from BAR WHERE Value = :info", info
print_out.each do |p|
    puts "%s %s %s" % [p[1],p[2],p[3]]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...