postgresql - Ecto.Repo.insert!使用“on_conflict: :nothing”引发 Postgresql“在“ON”处或附近出现语法错误”
问题描述
我对 Elixir 和 Phoenix 完全陌生,目前正在阅读“Programming Phoenix”一书。
我已经到了第 7 章,我有一个名为的数据库表categories
,其中包含一个列name
和一个数据库级唯一性约束name
。
如果在已经存在名为“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
- 外 3.4.2
- Postgres 12.1
解决方案
原来我误认为我的 postgres 版本是12.1
,这实际上是我的客户端的安装版本,而不是运行 9.4psql
的 postgres服务器。ON CONFLICT
是在 9.5 中添加的,所以解决方案是升级我的 postgres 服务器。
推荐阅读
- vue.js - Vue - 禁用 Eslint
- html - 数据列表是否可以向下滚动?
- java - spring boot application would not statring from cmd how to start it from cmd
- c++ - C++中的纯虚拟赋值运算符
- android - 使用工具栏主页时共享元素转换不起作用
- vba - 将单词修订拆分为修订而不更改应用的段落样式
- reflection - 是否可以使用其中一种方法获取结构的名称?
- java - JSON 中的非 UTF 8 字符
- php - Docker: Apache2 container can not talk to php7.1 container
- odoo-12 - ModuleNotFoundError:没有模块名称“odoo.addons,base.res”