SQL 子查询被附加为字符串而不是正确的查询
SQL Sub Query is being appended as a string instead of a proper query
我一直在尝试使用 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 = "select * from model where column = ?"
data = Model.find_by_sql [sql, 'some value']
旨在防止 SQL 注入。你在这里试图做的正是这种语法试图阻止的事情。这就是它不起作用的原因。
在将 SQL 发送到 find_by_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)
我一直在尝试使用 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 = "select * from model where column = ?"
data = Model.find_by_sql [sql, 'some value']
旨在防止 SQL 注入。你在这里试图做的正是这种语法试图阻止的事情。这就是它不起作用的原因。
在将 SQL 发送到 find_by_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)