如何使用Elixir / Ecto在jsonb PostgreSQL中查询空数组

时间:2019-04-16 11:36:37

标签: postgresql elixir ecto

我有一个Ecto模式,其embeds_many定义如下:

  schema "rounds" do
    embeds_many :growth_cycles, SomeModule.GrowthCycle, on_replace: :delete
  end

这将转换为PostgreSQL中的jsonb字段。默认值为空数组-[]。我想编写一个Ecto查询,该查询仅返回具有growth_cycles = [](growth_cycles未设置/为空)的回合。

我尝试过的最简单的方法是:

    from(r in Round, where: r.growth_cycles == [])

但这会产生以下错误:

** (Postgrex.Error) ERROR 42P18 (indeterminate_datatype) cannot determine type of empty array
...
hint: Explicitly cast to the desired type, for example ARRAY[]::integer[].

我也尝试过:

    from(r in Round, where: length(r.growth_cycles) == 0)

但这会给出一个错误,指出长度不是有效的查询表达式。

我看到了使用片段将其下拉到原始PostgreSQL的参考,但是我不确定如何做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用fragment/1将原始SQL插入查询中。

在这种情况下,类似

(from r in Round, where: fragment("? = '{}'", r.growth_cycles)) |> Repo.all

应该工作

从文档中:

  

不可能使用Ecto的查询语法表示所有可能的数据库查询。需要时,可以使用片段将任何表达式发送到数据库: