gpt4 book ai didi

elixir - 使用 Postgrex 和 Ecto 准备好的语句

转载 作者:行者123 更新时间:2023-12-01 12:37:18 24 4
gpt4 key购买 nike

我正在尝试利用返回纯 json 的 postgres 功能,所以我在我的 Ecto 模型中添加了一个方法来执行查询,返回想要的 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 注入(inject)潜力,是否可以使用准备好的语句之类的东西?

最佳答案

您正在寻找 the documentation for Ecto.Adapters.SQL.query/4 . SQL 语句可以包含数值变量,例如 $1$2、...,然后使用函数调用的第三个参数在列表中传递这些参数。

你可以通过以下方式实现你想要的:

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

关于elixir - 使用 Postgrex 和 Ecto 准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28566821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com