Передача данных между запросами 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
Другие вопросы по тегам