SQL子查询被附加为字符串,而不是适当的查询

问题描述 投票:0回答:1

我一直在尝试使用Rails find_by_sql功能并传递Sub Query作为参数。子查询将作为字符串而不是适当的query附加到父查询中。下面是我的SQL。

sql =  <<~SQL
    SELECT
      column_1,
      column_2
    FROM (
        ?
      ) AS sample_table
    GROUP BY
      column_1,
      column_2
SQL

somemodel = SomeModel.find_by_sql [sql, someotherquery.to_sql]

someotherquery.to_sql如下

SELECT * FROM someothertable WHERE column_1 in ('test') and column_2 in ('new test')

将其附加到父查询后,将在下面的SQL中将子查询作为字符串而不是正确的查询。

SELECT
      column_1,
      column_2
    FROM (
        'SELECT * FROM someothertable WHERE column_1 in (''test'') and column_2 in (''new test'')'
      ) AS sample_table
    GROUP BY
      column_1,
      column_2
sql ruby ruby-on-rails-5
1个回答
1
投票

事实是,语法:

sql  = "select * from model where column = ?"
data = Model.find_by_sql [sql, 'some value']

旨在防止SQL注入。您在此试图做的正是该语法试图防止的事情。这就是为什么它不起作用的原因。

在将其发送到find_by_sql方法之前,必须在SQL中手动替换问号。

例如,在创建SQL字符串期间:

sql =  <<~SQL
    SELECT
      column_1,
      column_2
    FROM (
        #{someotherquery.to_sql}
      ) AS sample_table
    GROUP BY
      column_1,
      column_2
SQL

或通过执行替换:

sql.sub!('?', someotherquery.to_sql)

最后,现在您可以将其发送到find_by_sql以执行查询

somemodel = SomeModel.find_by_sql(sql)
© www.soinside.com 2019 - 2024. All rights reserved.