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 предоставляет абстракции для таких случаев, чтобы помочь вам избегать подобного рода ошибок и уязвимостей.