使用 Postgrex 和 Ecto 准备好的语句
Prepared statements with Postgrex & Ecto
我正在尝试利用返回纯 json 的 postgres 功能,所以我在我的 Ecto 模型中添加了一个方法来执行查询,returns 想要的 json.
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 注入潜力,是否可以使用准备好的语句之类的东西?
您正在寻找 the documentation for Ecto.Adapters.SQL.query/4
。 SQL 语句可以有数值变量,例如 </code>、<code>
、...,然后使用函数调用的第三个参数在列表中传递这些参数。
你可以通过以下方式实现你想要的:
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=) json;"
result = Ecto.Adapters.SQL.query(BoardApi.Repo, sql, [id])
# `return` is not valid Elixir
result.rows |> hd |> elem(0)
end
end
我正在尝试利用返回纯 json 的 postgres 功能,所以我在我的 Ecto 模型中添加了一个方法来执行查询,returns 想要的 json.
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 注入潜力,是否可以使用准备好的语句之类的东西?
您正在寻找 the documentation for Ecto.Adapters.SQL.query/4
。 SQL 语句可以有数值变量,例如 </code>、<code>
、...,然后使用函数调用的第三个参数在列表中传递这些参数。
你可以通过以下方式实现你想要的:
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=) json;"
result = Ecto.Adapters.SQL.query(BoardApi.Repo, sql, [id])
# `return` is not valid Elixir
result.rows |> hd |> elem(0)
end
end