Prisma 6の新機能 - TypeSafeなORMがさらに進化

2025.12.12

Prisma 6の概要

Prisma 6は、Typed SQLの導入により、生SQLクエリにも型安全性をもたらします。また、クエリパフォーマンスの改善、新しいクライアント機能が追加されています。

Typed SQL

生SQLクエリに対して完全な型安全性を提供します。

// sql/getUserWithPosts.sql
-- @param {Int} $1:userId
SELECT
  u.id,
  u.name,
  u.email,
  json_agg(p.*) as posts
FROM users u
LEFT JOIN posts p ON p.author_id = u.id
WHERE u.id = $1
GROUP BY u.id;
// 生成された型安全な関数
import { getUserWithPosts } from '@prisma/client/sql';

const result = await prisma.$queryRawTyped(
  getUserWithPosts(123)
);

// resultは完全に型付けされている
console.log(result.name);  // string
console.log(result.posts); // Post[]

パフォーマンス改善

クエリエンジンの最適化

Prisma 5 vs Prisma 6 ベンチマーク:
- 単純なfindMany: 15%高速化
- リレーション含むクエリ: 25%高速化
- 大量データ取得: 30%高速化

バッチ処理の改善

// 自動バッチング
const users = await Promise.all([
  prisma.user.findUnique({ where: { id: 1 } }),
  prisma.user.findUnique({ where: { id: 2 } }),
  prisma.user.findUnique({ where: { id: 3 } }),
]);
// 内部で1つのクエリにバッチ化

新しいクライアント機能

omit でフィールド除外

// パスワードフィールドを除外
const user = await prisma.user.findUnique({
  where: { id: 1 },
  omit: {
    password: true
  }
});
// user.password は存在しない

relationLoadStrategy

// 明示的なリレーション読み込み戦略
const user = await prisma.user.findUnique({
  where: { id: 1 },
  include: {
    posts: true
  },
  relationLoadStrategy: 'join' // または 'query'
});

Prisma Client Extensions 強化

const prisma = new PrismaClient().$extends({
  model: {
    user: {
      // カスタムメソッド
      async signUp(email: string, password: string) {
        const hashedPassword = await hash(password);
        return prisma.user.create({
          data: { email, password: hashedPassword }
        });
      }
    }
  },
  query: {
    $allModels: {
      // 全モデルに適用するフック
      async $allOperations({ model, operation, args, query }) {
        const start = Date.now();
        const result = await query(args);
        console.log(`${model}.${operation}: ${Date.now() - start}ms`);
        return result;
      }
    }
  }
});

// 使用
await prisma.user.signUp('user@example.com', 'password123');

マイグレーションの改善

差分マイグレーション

# 差分を確認してからマイグレーション
prisma migrate diff \
  --from-schema-datamodel prisma/schema.prisma \
  --to-schema-datasource prisma/schema.prisma

# マイグレーション実行
prisma migrate dev --name add_user_profile

マイグレーションのロールバック

# 最後のマイグレーションをロールバック
prisma migrate rollback

Prisma Accelerate

エッジでのコネクションプーリングとキャッシュ機能。

import { PrismaClient } from '@prisma/client/edge';
import { withAccelerate } from '@prisma/extension-accelerate';

const prisma = new PrismaClient().$extends(withAccelerate());

// キャッシュ付きクエリ
const users = await prisma.user.findMany({
  cacheStrategy: {
    ttl: 60,
    swr: 120
  }
});

移行ガイド

# Prisma 6にアップグレード
npm install prisma@latest @prisma/client@latest

# クライアント再生成
npx prisma generate

破壊的変更

変更対応
Node.js 18以上が必須Node.jsをアップグレード
一部のデフォルト値変更明示的に設定

まとめ

Prisma 6は、Typed SQLによる生SQLの型安全性、パフォーマンス改善、新しいクライアント機能により、より強力なORMへと進化しました。特にTyped SQLは、複雑なクエリを書く必要がある場合に非常に有用です。

← 一覧に戻る