代码之家  ›  专栏  ›  技术社区  ›  lumos

在sql查询和单独的ruby文件之间传递数据

  •  0
  • lumos  · 技术社区  · 6 年前

    我正在使用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
    

    问题是我真的不知道怎么通过 价值 参数,以便 execute 命令是该值的特定数据。对于tiny_tds,这是可能的吗?或者tiny_tds不适合外部sql查询和调用它们的ruby函数之间的这种双向交互吗?我愿意考虑其他sql库,我只是对这些选项非常陌生,因为我主要处理ruby方面的事情。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Michał Młoźniak    6 年前

    你可以使用 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
    
    推荐文章