Почему Prisma отказывается выполнять данный запрос?

Как можно исправить код, чтобы избежать ошибки PrismaClientKnownRequestError при использовании условных операторов в запросе prisma.$queryRaw()?
  • 30 января 2024 г. 18:38
Ответы на вопрос 2
Prisma является строго типизированным клиентом ORM, который обеспечивает безопасность типов и предотвращает SQL-инъекции. Однако, это также означает, что он ограничивает использование динамических запросов для предотвращения случайных или злонамеренных запросов к базе данных.

Если Prisma отказывается выполнять запрос через `prisma.$queryRaw()`, это может быть связано с использованием условных операторов в строковом запросе, которые могут считаться небезопасными. Prisma ожидает, что аргументы для `queryRaw` и `executeRaw` будут обернуты в родные шаблонные строки для упрощения защиты от SQL инъекций.

Чтобы исправить код и избежать `PrismaClientKnownRequestError`, вам нужно убедиться, что все динамические значения параметризированы. Давайте мы предположим, что у вас есть следующий запрос, который вызывает ошибку:

```js
const userId = 1;
const active = true;
const query = `
  SELECT * FROM users
  WHERE id = ${userId}
  ${active ? 'AND status = "active"' : ''}
`;
const users = await prisma.$queryRaw(query);
```

Измените его следующим образом, используя тегированный шаблон строк `Prisma.sql` для предотвращения встроенных ошибок и возможных SQL-инъекций:

```js
const userId = 1;
const active = true;
const query = Prisma.sql`
  SELECT * FROM users
  WHERE id = ${userId}
  ${active ? Prisma.sql`AND status = "active"` : Prisma.empty}
`;
const users = await prisma.$queryRaw(query);
```

Или, если вам надо использовать более сложные условия, вы можете строить запрос, используя API Prisma, который предоставляет безопасные методы для формирования условий:

```js
const userId = 1;
const active = true;

const whereClause = {
  id: userId,
  ...(active && { status: 'active' }),
};

const users = await prisma.user.findMany({
  where: whereClause,
});
```

В этом случае вы используете метод `findMany` из Prisma клиента со сложной логикой в `where` без необходимости написания собственного SQL, что уменьшит риск возникновения ошибок, касающихся безопасности и синтаксиса запросов.

Помните, что когда дело доходит до использования `queryRaw` или `executeRaw`, вам следует использовать параметризованные запросы, чтобы присваивать значения переменных. Prisma предоставляет абстракции для таких случаев, чтобы помочь вам избегать подобного рода ошибок и уязвимостей.
Смотрите внимательней на кавычки и другие разделители
Похожие вопросы