在 SQL 查询和单独的 Ruby 文件之间传递数据
Passing data between SQL queries and separate Ruby file
我正在使用 tiny_tds 从几个不同的数据库中提取数据。截至目前,我有一个包含多种方法的 Ruby 文件,每个方法都专门用于特定查询(因为数据库非常大,而且并非我使用的所有脚本都需要相同的 kind/amount 数据的)。为了使事情更清晰、更容易,我想将 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 方面的事情。
您可以使用 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
我正在使用 tiny_tds 从几个不同的数据库中提取数据。截至目前,我有一个包含多种方法的 Ruby 文件,每个方法都专门用于特定查询(因为数据库非常大,而且并非我使用的所有脚本都需要相同的 kind/amount 数据的)。为了使事情更清晰、更容易,我想将 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 方面的事情。
您可以使用 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