13. Сырые SQL-запросы
Несмотря на богатый API Prisma Client, иногда необходимо выполнить сложный SQL-запрос напрямую. Для этого Prisma предоставляет методы $queryRaw и $executeRaw.
$queryRaw — запросы с результатом
Заголовок раздела «$queryRaw — запросы с результатом»import { Prisma } from '@prisma/client'
// Используйте тегированный шаблон Prisma.sql для безопасных запросовconst users = await prisma.$queryRaw( Prisma.sql`SELECT * FROM "users" WHERE age > ${minAge}`)Функция возвращает массив объектов. Обратите внимание: типы не выводятся автоматически, поэтому нужно явно указать тип результата:
const users = await prisma.$queryRaw<User[]>( Prisma.sql`SELECT * FROM "users" WHERE role = ${role}`)$executeRaw — команды без результата
Заголовок раздела «$executeRaw — команды без результата»const affectedRows = await prisma.$executeRaw( Prisma.sql`UPDATE "users" SET "lastLoginAt" = NOW() WHERE "id" = ${userId}`)console.log(`Обновлено записей: ${affectedRows}`)Почему Prisma.sql, а не строки?
Заголовок раздела «Почему Prisma.sql, а не строки?»Никогда не используйте интерполяцию строк для SQL-запросов — это уязвимость к SQL-инъекциям:
// ❌ ОПАСНО — SQL-инъекция!const users = await prisma.$queryRawUnsafe( `SELECT * FROM users WHERE name = '${userInput}'`)
// ✅ БЕЗОПАСНО — параметризованный запросconst users = await prisma.$queryRaw( Prisma.sql`SELECT * FROM users WHERE name = ${userInput}`)Когда использовать сырые запросы?
Заголовок раздела «Когда использовать сырые запросы?»- Сложные JOIN-запросы с несколькими уровнями вложенности
- Полнотекстовый поиск с особыми операторами
- Специфические функции конкретной СУБД
- Оптимизация производительности в критических местах
- Оконные функции (WINDOW FUNCTIONS)