Ecto.Repo.insert!与“ on_conflict::nothing”一起引发Postgresql“在“ ON”或附近的语法错误”

问题描述 投票:0回答:1

我对Elixir和Phoenix完全陌生,目前正在研究“ Programming Phoenix”一书。

我已经读到第7章,并且有一个名为categories的数据库表,其中具有列namename上的数据库级唯一性约束。

如果在已经存在名为“ Hello”的类别时运行以下行,则会得到预期的Ecto.ConstraintError

> Rumbl.Repo.insert!(%Rumbl.Multimedia.Category{name: "Hello"})
[debug] QUERY ERROR db=3.2ms queue=4.9ms idle=9982.9ms
INSERT INTO "categories" ("name","inserted_at","updated_at") VALUES ($1,$2,$3) RETURNING "id" ["Hello", ~N[2020-04-18 07:05:04], ~N[2020-04-18 07:05:04]]
** (Ecto.ConstraintError) constraint error when attempting to insert struct:

    * categories_name_index (unique_constraint)

[现在,这本书告诉我,可以将选项on_conflict: :nothing添加到对insert!的调用中,这将防止引发错误。但是实际上发生的是我收到了postgres语法错误:

> Rumbl.Repo.insert!(%Rumbl.Multimedia.Category{name: "Hello"}, on_conflict: :nothing)
** (Postgrex.Error) ERROR 42601 (syntax_error) syntax error at or near "ON"

    query: INSERT INTO "categories" ("name","inserted_at","updated_at") VALUES ($1,$2,$3) ON CONFLICT DO NOTHING RETURNING "id"
    (ecto_sql) lib/ecto/adapters/sql.ex:612: Ecto.Adapters.SQL.raise_sql_call_error/1
    (ecto) lib/ecto/repo/schema.ex:657: Ecto.Repo.Schema.apply/4
    (ecto) lib/ecto/repo/schema.ex:263: anonymous fn/15 in Ecto.Repo.Schema.do_insert/4
    (ecto) lib/ecto/repo/schema.ex:164: Ecto.Repo.Schema.insert!/4
[debug] QUERY ERROR db=0.0ms queue=0.8ms idle=9038.9ms
INSERT INTO "categories" ("name","inserted_at","updated_at") VALUES ($1,$2,$3) ON CONFLICT DO NOTHING RETURNING "id" ["Hello", ~N[2020-04-18 07:05:13], ~N[2020-04-18 07:05:13]]

版本号:

  • 药剂1.9.4
  • 凤凰1.4.10
  • Ecto 3.4.2
  • Postgres 12.1
postgresql elixir ecto phoenix
1个回答
0
投票
server。 ON CONFLICT是在9.5中添加的,因此解决方案是升级我的postgres服务器。
© www.soinside.com 2019 - 2024. All rights reserved.