3

純粋なjsonを返すpostgres機能を利用しようとしているので、クエリを実行して必要なjsonを返すメソッドをEctoモデルに追加しました。

defmodule BoardApi.Board do
  use Ecto.Model

  def json_by_id(id) do
    sql = "SELECT row_to_json(json) AS result FROM (SELECT array_agg(users) AS users FROM users WHERE id=#{id}) json;"
    result = Ecto.Adapters.SQL.query(BoardApi.Repo, sql, [])

    return List.first(result.rows) |> Tuple.to_list |> List.first
  end

私の問題は、これにはSQLインジェクションの可能性があるということです.準備されたステートメントのようなものを使用することは可能ですか?

4

1 に答える 1

4

のドキュメントをEcto.Adapters.SQL.query/4探しています。$1SQL ステートメントには、、、 ...などの数値変数を含めることができます$2。これらのパラメーターは、関数呼び出しの 3 番目の引数を使用してリストで渡されます。

あなたが望むものを達成することができます:

defmodule BoardApi.Board do
  use Ecto.Model

  def json_by_id(id) do
    sql = "SELECT row_to_json(json) AS result FROM (SELECT array_agg(users) AS users FROM users WHERE id=$1) json;"
    result = Ecto.Adapters.SQL.query(BoardApi.Repo, sql, [id])

    # `return` is not valid Elixir
    result.rows |> hd |> elem(0)
  end
end
于 2015-02-17T17:16:37.470 に答える