使用片段在 @> 运算符之后参数化值
Parameterize value after @> operator using fragments
我实际上是在尝试 运行 这个查询,但是有一个参数化的值:
select * from accounts.businesses where admins @> '{1234}';
这是我的函数定义:
def get_businesses_by_id(id) do
from(b in Businesses, where: fragment("? @> '{?}'", b.admins, ^id))
|> Repo.all()
end
但我收到以下错误:
** (ArgumentError) parameters must be of length 0 for query %Postgrex.Query
如果我直接在其中硬编码该值,那么它会起作用:
def get_businesses_by_id(id) do
from(b in Businesses, where: fragment("? @> '{1234}'", b.admins))
|> Repo.all()
end
是否了解如何有效地参数化 ID 值?
除非使用 @>
operator is absolutely necessary, using ANY
应该可行:
def get_businesses_by_id(id) do
from(b in Businesses, where: fragment("? = ANY(?)", ^id, b.admins))
|> Repo.all()
end
你不能在字符串中使用"placeholder",但你不需要字符串,你需要数组,所以你可以这样做:
fragment("? @> ?", b.admins, ^[id])
但是作为 GIN index also supports =
operator on arrays 它也应该与 ANY
一起工作所以你可以写:
where: ^id in b.admins
我实际上是在尝试 运行 这个查询,但是有一个参数化的值:
select * from accounts.businesses where admins @> '{1234}';
这是我的函数定义:
def get_businesses_by_id(id) do
from(b in Businesses, where: fragment("? @> '{?}'", b.admins, ^id))
|> Repo.all()
end
但我收到以下错误:
** (ArgumentError) parameters must be of length 0 for query %Postgrex.Query
如果我直接在其中硬编码该值,那么它会起作用:
def get_businesses_by_id(id) do
from(b in Businesses, where: fragment("? @> '{1234}'", b.admins))
|> Repo.all()
end
是否了解如何有效地参数化 ID 值?
除非使用 @>
operator is absolutely necessary, using ANY
应该可行:
def get_businesses_by_id(id) do
from(b in Businesses, where: fragment("? = ANY(?)", ^id, b.admins))
|> Repo.all()
end
你不能在字符串中使用"placeholder",但你不需要字符串,你需要数组,所以你可以这样做:
fragment("? @> ?", b.admins, ^[id])
但是作为 GIN index also supports =
operator on arrays 它也应该与 ANY
一起工作所以你可以写:
where: ^id in b.admins