Передача данных между запросами SQL и отдельным файлом Ruby
Я использую tiny_tds для извлечения данных из нескольких разных баз данных. На данный момент у меня есть файл Ruby с несколькими методами, каждый из которых посвящен определенному запросу (поскольку базы данных очень большие, и не все скрипты, которые я использую, требуют одинакового вида / объема данных). Чтобы было проще и понятнее, я хотел отделить сами запросы SQL в один файл, а не встраивать их в файл Ruby, содержащий функции. Но запросы SQL зависят от определенных полей, имеющих определенные значения. По сути, я пытаюсь отправить переменную в SQL-запрос, получить данные на основе этого конкретного значения в поле и передать эти данные обратно в файл Ruby.
Итак, упрощенная версия того, что я сейчас делаю, такова:
def initialize
@client = TinyTds::Client.new(:username => '', :password => '', :host => '', timeout: 0)
end
def query_example(value)
results = @client.execute("SELECT DISTINCT field1, field2, field3
FROM db
WHERE field1 = '#{value}'
")
results.each {|x| return x}
end
Скрипт вызывает query_example(value)
функция и на основе value
переменная, получает соответствующие данные для этого случая.
Но то, что я хотел бы, это по существу иметь один файл, который не имеет ничего, кроме необработанных запросов SQL, например:
SELECT DISTINCT field1, field2, field3
FROM db
WHERE field1 = '#{value}'
где #{value}
заполняется внешним значением, переданным ему (хотя я не уверен, как этот тип подстановочного знака будет объявлен здесь). Допустим, я сохранил этот файл как "query.sql", тогда я просто хотел бы прочитать этот файл в функцию Ruby, например:
def query_example(value)
query = File.read("query.sql")
results = @client.execute(query)
end
Проблема в том, что я не знаю, как это пройти value
аргумент в самом файле SQL, так что данные, которые извлекаются с execute
Команда - это конкретные данные для этого значения. Возможно ли это с tiny_tds, или tiny_tds просто не создан для такого двустороннего взаимодействия между внешними запросами SQL и вызывающими их функциями Ruby? Я открыт для рассмотрения других библиотек SQL, я просто очень незнаком с опциями, так как я имею дело в основном с Ruby.
1 ответ
Ты можешь использовать format
метод замены заполнителей фактическими значениями. Вот самый простой пример:
template = "Hello, %{name}!"
format(template, name: "World")
=> "Hello, World!"
И ваш код может выглядеть так:
# query.sql
SELECT DISTINCT field1, field2, field3
FROM db
WHERE field1 = '%{value}'
# ruby file
def query_example(value)
query = File.read("query.sql")
results = @client.execute(format(query, value: value))
end