Ecto.Repo.insert! с "on_conflict:: ничто", повышая синтаксическую ошибку Postgresql в или около "ON" " - PullRequest
0 голосов
/ 18 апреля 2020

Я совершенно новичок в Elixir и Phoenix, и в настоящее время работаю над книгой "Программирование 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]]

Номера версий:

  • Elixir 1.9.4
  • Phoenix 1.4.10
  • Ecto 3.4.2
  • Postgres 12.1

1 Ответ

0 голосов
/ 18 апреля 2020

Оказывается, я ошибся, что моя postgres версия 12.1, на самом деле это установленная версия моего psql клиента, а не мой postgres сервер , который работал под управлением 9.4. ON CONFLICT был добавлен в 9.5, поэтому решение состоит в том, чтобы обновить мой postgres сервер.

...