SQL Подзапрос добавляется как строка вместо правильного запроса - PullRequest
0 голосов
/ 17 января 2020

Я пытался использовать функциональность 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

1 Ответ

1 голос
/ 18 января 2020

Дело в том, что синтаксис:

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)
...