Working with Raw SQL Queries

1. Executing Raw SELECT

const rows = await prisma.$queryRaw`SELECT id, email FROM "User" WHERE active = true`;
APIUse
$queryRawTagged template, parameterized
$queryRawUnsafePlain string (dangerous)
$queryRawTyped<T>Explicit return type

2. Using Parameterized Queries

const id = 5;
const user = await prisma.$queryRaw`SELECT * FROM "User" WHERE id = ${id}`;
AspectDetail
SafeValues auto-escaped as bind params
TypeJS values map to DB types

3. Executing Raw Write Operations

const rowsAffected = await prisma.$executeRaw`UPDATE "User" SET active = false WHERE id = ${id}`;
APIReturns
$executeRawAffected row count
$executeRawUnsafeAffected row count (no escape)

4. Using Unsafe Raw Queries

Warning: $queryRawUnsafe and $executeRawUnsafe interpolate strings directly. Validate inputs against an allowlist before use to prevent SQL injection.
UseWhen
Dynamic columnsColumn allowlisting required
Dynamic table namesOtherwise impossible with tagged template

5. Typing Raw Query Results

type Row = { id: number; total: number };
const rows = await prisma.$queryRaw<Row[]>`SELECT id, total FROM "Order"`;
NoteDetail
NumbersBigInt columns return bigint
DecimalsReturn Prisma.Decimal

6. Using Tagged Template Literals

ElementDetail
Backticks requiredDistinguishes from string call
IdentifiersUse Prisma.sql + Prisma.raw for dynamic parts
import { Prisma } from "@prisma/client";
const col = Prisma.raw('"createdAt"');
await prisma.$queryRaw(Prisma.sql`SELECT ${col} FROM "Post" WHERE id = ${id}`);

7. Escaping Values Safely

HelperUse
Prisma.sqlCompose parameterized fragments
Prisma.join(arr, ',')Join arrays safely
Prisma.emptyNo-op fragment
Prisma.rawInserts unsanitized literal (dangerous)

8. Executing Multiple Statements

AspectDetail
Single statementDefault for raw helpers
Multi-statementUse $transaction with multiple $executeRaw

9. Using Database-Specific Functions

UseExample
PostGISST_Distance
Window functionsROW_NUMBER() OVER
JSON opsjsonb_set, JSON_EXTRACT

10. Combining Raw and Type-Safe Queries

PatternDetail
HybridUse raw for analytics, ORM for CRUD
In transactionBoth share tx client