Запрос уникальных составных полей с помощью Prisma

У меня есть поле учетной записи в моей базе данных Postgres, в котором есть как имя пользователя, так и организация, к которой оно принадлежит. Эти поля вместе должны быть уникальными, то есть несколько пользователей могут иметь одно и то же имя пользователя, но несколько пользователей в одной организации не могут иметь одно и то же имя пользователя.

create table account (
    user_id serial primary key,
    username varchar not null,
    password varchar not null,
    is_admin bool not null default false,
    organization_id int not null references organization(organization_id) on delete cascade,
    unique (username, organization_id)
);

При использовании Prisma в NodeJs для запроса учетной записи по имени пользователя + идентификатору организации, чтобы получить точного пользователя, я использую этот запрос:

export async function getAccountByUsernameAndOrganization(username, organization_id) {
  return runQuery(
    prisma.account.findOne({
      where: {
        username,
        organization_id,
      },
    }),
  );

Однако запрос не выполняется с сообщениями:

Для аргумента типа accountWhereUniqueInput требуется ровно один аргумент, но вы указали имя пользователя и идентификатор организации. Пожалуйста, выберите один. Доступные аргументы:

type accountWhereUniqueInput {
  user_id?: Int
  customer_id?: String
  organization_id?: Int
  account_username_organization_id_key?: Account_username_organization_id_keyCompoundUniqueInput
}

Неизвестный аргумент 'username' в where.username для типа accountWhereUniqueInput. Вы имели в виду user_id? Доступные аргументы:

type accountWhereUniqueInput {
  user_id?: Int
  customer_id?: String
  organization_id?: Int
  account_username_organization_id_key?: Account_username_organization_id_keyCompoundUniqueInput
}

person DasBeasto    schedule 26.08.2020    source источник


Ответы (1)


Я понял ответ вскоре после публикации. Вам необходимо определить составной ключ, который был создан для полей, и запросить это составное поле напрямую, передав два поля в качестве объекта в качестве значения.

export async function getAccountByUsernameAndOrganization(username, organization_id) {
  return runQuery(
    prisma.account.findOne({
      where: {
        account_username_organization_id_key: { username, organization_id },
      },
    }),
  );
}
person DasBeasto    schedule 26.08.2020
comment
как именно вы нашли account_username_organization_id_key? - person Davo; 26.04.2021
comment
Nvm, возвращенная ошибка сообщает доступные ключи - person Davo; 26.04.2021