"атрибут 5 имеет неправильный тип" при вставке jsonb с ON CONFLICT в представление postgres? - PullRequest
0 голосов
/ 25 июня 2018

У меня есть таблица ролей, которая выглядит следующим образом:

    Table "public.roles"
     Column      |  Type   |                     Modifiers
-----------------+---------+----------------------------------------------------
 id              | integer | not null default nextval('roles_id_seq'::regclass)
 name            | text    | not null
 organization_id | integer |
 is_system       | boolean | default false
 definition      | jsonb   | default '{}'::jsonb
Indexes:
    "roles_pkey" PRIMARY KEY, btree (id)
    "roles_name_organization_id_idx" UNIQUE, btree (name, organization_id)
Foreign-key constraints:
    "roles_organization_id_fkey" FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE
Referenced by:
    TABLE "role_roles" CONSTRAINT "role_roles_subject_role_id_fkey" FOREIGN KEY (subject_role_id) REFERENCES roles(id) ON DELETE CASCADE
    TABLE "role_roles" CONSTRAINT "role_roles_target_role_id_fkey" FOREIGN KEY (target_role_id) REFERENCES roles(id) ON DELETE CASCADE
    TABLE "user_roles" CONSTRAINT "user_roles_role_id_fkey" FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
Triggers:
    add_pg_role_on_add BEFORE INSERT OR UPDATE ON roles FOR EACH ROW EXECUTE PROCEDURE add_pg_role_on_add()
    delete_pg_role_on_delete BEFORE DELETE ON roles FOR EACH ROW EXECUTE PROCEDURE delete_pg_role_on_delete()

И представление "api". "Роли", которое выглядит как

CREATE VIEW api.roles AS SELECT * FROM roles WHERE organization_id IN (select * from organization_ids()) OR is_superuser();

Где organization_ids - это функция, которая возвращает организации, членом которых является пользователь.

Когда я делаю запрос вставки, как это:

INSERT INTO "api"."roles" ("id", "name", "organization_id", "definition") VALUES (DEFAULT, 'coder', 289, '{}'::jsonb)
ON CONFLICT ("name", "organization_id")
  DO UPDATE SET "name" = EXCLUDED."name", "definition" = EXCLUDED."definition",
    "organization_id"  = EXCLUDED."organization_id";

Я получаю следующую ошибку:

ERROR:  attribute 5 has wrong type
DETAIL:  Table has type integer, but query expects jsonb.

Я погуглил и не могу понять, что он пытается сказать, что это неправильно с этой вставкой. Если я удаляю бит EXCLUDED.definition, запрос работает. Кажется, это не зависит от фактического значения definition, которое вставляется, а скорее от того, что я обновляю столбец определения. Я также могу обновить столбец определения для записей в этом представлении, используя команду UPDATE. Кажется, это просто разрушенная пустыня.

Кто-нибудь знает, что вызывает это или как это исправить?

Заранее спасибо!

...