Перейти к содержимому

13. Сырые SQL-запросы

Несмотря на богатый API Prisma Client, иногда необходимо выполнить сложный SQL-запрос напрямую. Для этого Prisma предоставляет методы $queryRaw и $executeRaw.

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}`
)
const affectedRows = await prisma.$executeRaw(
Prisma.sql`UPDATE "users" SET "lastLoginAt" = NOW() WHERE "id" = ${userId}`
)
console.log(`Обновлено записей: ${affectedRows}`)

Никогда не используйте интерполяцию строк для 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)