postgresql - Elixir : check if postgresql map column has key

标签 postgresql elixir ecto

使用 json/jsonb 数据类型 ecto 建议 to use fragments .

在我的例子中,我必须使用 PostgreSQL ? 运算符来查看 map 是否有这样的键,但是它会变成这样的:

where(events, [e], e.type == 1 and not fragment("???", e.qualifiers, "?", "2"))

当然 fragment 读取 PostgreSQL ? 作为占位符。我如何检查 map 是否有这样的 key ?

最佳答案

需要对中间的?进行转义,传递给fragment一共三个参数:

fragment("? \\? ?", e.qualifiers, "2")

演示:

iex(1)> MyApp.Repo.insert! %MyApp.Food{name: "Foo", meta: %{price: 1}}
iex(2)> MyApp.Repo.insert! %MyApp.Food{name: "Foo", meta: %{}}
iex(3)> MyApp.Repo.all from(f in MyApp.Food, where: fragment("? \\? ?", f.meta, "price"))
[debug] SELECT f0."id", f0."name", f0."meta", f0."inserted_at", f0."updated_at" FROM "foods" AS f0 WHERE (f0."meta" ? 'price') [] OK query=8.0ms
[%MyApp.Food{__meta__: #Ecto.Schema.Metadata<:loaded>, id: 1,
  inserted_at: #Ecto.DateTime<2016-06-19T03:51:40Z>, meta: %{"price" => 1},
  name: "Foo", updated_at: #Ecto.DateTime<2016-06-19T03:51:40Z>}]
iex(4)> MyApp.Repo.all from(f in MyApp.Food, where: fragment("? \\? ?", f.meta, "a"))
[debug] SELECT f0."id", f0."name", f0."meta", f0."inserted_at", f0."updated_at" FROM "foods" AS f0 WHERE (f0."meta" ? 'a') [] OK query=0.8ms
[]

我不确定这是否在任何地方记录,但我从 this 中找到了方法测试。

关于postgresql - Elixir : check if postgresql map column has key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37903679/

相关文章:

spring - 使用 Spring MVC 确认密码的最简单方法

node.js - 如何在 node.js 域中添加全局发射器?

Elixir - 如何将字符串每 3 个字符拆分为一个列表

elixir - 阻止/长时间运行的 Phoenix 请求

elixir - 如何序列化 Ecto 记录结构以使其可存储为 :map in the database?

elixir - 在 Ecto 中我什么时候应该使用 assoc_constraint 与foreign_key_constraint

sql - Postgres : when index is used

list - 除了 `--` 和 `++` 之外,Elixir 是否还有其他列表运算符?

elixir - 在 Ecto 中对 OR 进行条件验证 - 需要 2 个字段中的 1 个

java - hibernate 、PostgreSQL : Could not extract resultset, SQLState 25P02