数据库片段查询错误“查询的参数长度必须为0”

时间:2018-10-26 13:52:26

标签: postgresql elixir ecto

我正在尝试在building表,jsonb metadata列以及google_place_ids属性内查询一个json数组。

Elixir给我一个错误:

这是片段正在生成的查询:

SELECT b0."id", b0."base_sku", b0."name", b0."logo", b0."email", b0."active", b0."sync", b0."building_group_id", b0."operating_region_id", b0."building_package_id", b0."metadata", b0."location", b0."inserted_at", b0."updated_at" FROM "buildings" AS b0 WHERE (b0."metadata"->'google_place_ids' @> '["$1"]') AND (b0."active" = TRUE) ["1234231223123"]

代码如下:

defp query_by_google_place_id(query, google_place_id) do
from(b in query,
    where: fragment("?->'google_place_ids' @> '[\"?\"]'", b.metadata,  ^google_place_id),
    where: b.active == true,
    limit: 1)
end

这是错误:

[error] #PID<0.1340.0> running Proxy.InstrumentedPlug terminated
Server: localhost:4000 (http)
Request: GET /something/google_place_id/1234231223123
** (exit) an exception was raised:
    ** (ArgumentError) parameters must be of length 0 for query %Postgrex.Query{columns: 

2 个答案:

答案 0 :(得分:2)

这不是PostgreSQL理解的方式。问题在于Ecto的fragment对您可以在其中使用的SQL(或其他查询语言)一无所知,因此结束了将?视为查询参数,而PostgreSQL将其视为原始字符串{{ 1}}。您需要做的是直接以以下形式传递字符串:

"$1"

答案 1 :(得分:0)

此方法有效,引号较少且没有括号

defp query_by_google_place_id(query, google_place_id) do
    from(b in query,
        where: fragment("?->'google_place_ids' @> ?", b.metadata, ^google_place_id),
        where: b.active == true,
        limit: 1)
end