Передача данных между запросами SQL и отдельным файлом Ruby - PullRequest
0 голосов
/ 19 января 2019

Я использую 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 Ответ

0 голосов
/ 19 января 2019

Вы можете использовать метод 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
...