Prisma 基礎編 〜TypeScriptと相性抜群のORM〜

記事タイトルとURLをコピーする

Prismaとは?

Prismaは、Node.js向けのORM(Object-Relational Mapping)ツールです。

最大の特徴は 型安全なデータベースアクセス にあり、
簡潔なコードでDB操作を記述でき、TypeScriptとの相性が非常に良いことが強みです。

  • SQLを直接書かなくてもデータ操作ができる
  • スキーマからTypeScriptの型が自動生成される
  • 型ミスをコンパイル時に検知できる

※ ORMとは?

ORM(Object-Relational Mapping)とは、

プログラミング言語のオブジェクトを使って
SQLを書かずにデータベースを操作できる仕組み

のことです。


Prismaのデータモデル

Prismaでは、データベースの構造を schema.prisma ファイルで定義します。

model User {
  id    Int    @id @default(autoincrement())
  name  String
  age   Int
  posts Post[]
}

model Post {
  id      Int    @id @default(autoincrement())
  title   String
  content String
  userId  Int
  user    User   @relation(fields: [userId], references: [id])
}

ポイント

  • model:データベースのテーブルを表す
  • @id:主キー
  • @relation:テーブル間のリレーション定義
  • 1対多の関係(User : Post)を直感的に表現できる

型安全なクエリの作成

Prismaは、スキーマを元にTypeScriptの型を自動生成します。

そのため、型が間違っている場合は
実行前にTypeScriptのエラーとして検知できます。

await prisma.user.create({
  data: { name: "Taro", age: "twenty" }
});
// age は number 型のため TypeScript エラーになる

Prismaのデータモデル

データベースのテーブル構造を schema.prisma ファイルで定義します。

model User {
  id    Int    @id @default(autoincrement())
  name  String
  age   Int
  posts Post[]
}

model Post {
  id      Int    @id @default(autoincrement())
  title   String
  content String
  userId  Int
  user    User   @relation(fields: [userId], references: [id])
}

Prismaでできること

データの取得・作成・更新・削除(CRUD操作)

Prismaでは、以下の CRUD操作 を簡単に行えます。

操作 内容
C(Create) 新しいデータを作成
R(Read) データを取得
U(Update) 既存データを更新
D(Delete) データを削除

型安全なクエリの作成

データベースのスキーマ(構造)に基づいてTypeScriptの型が自動生成されます。

間違った型のデータを操作しようとすると、TypeScriptのエラーで気づくことができます。

Prismaはデータベース操作時に型安全を提供するためにTypeScriptの型を自動生成します。 Zodはクライアントサイドでのデータバリデーションを提供します。

await prisma.user.create({data: {name: 'Taro', age: 'twenty'}}); // ← ageは数値型なのでエラー

Prismaの主なメソッド

データの取得

  • findMany():複数のデータを取得
  • findUnique():一意のデータを取得(id などのユニークキーを指定)
  • findFirst():条件に一致する最初のデータを取得

データの作成

  • create():新しいデータを作成
  • createMany():複数のデータを一括作成

データの更新

  • update():指定したデータを更新
  • updateMany():条件に一致する複数のデータを一括更新

データの削除

  • delete(): 指定したデータを削除
  • deleteMany():条件に一致する複数のデータを一括削除

SQLとPrismaの違い

従来のSQLでは、データベースに対して直接クエリを記述する必要があり、複雑なクエリを書くのに手間がかかります。

Prismaを使うことで、SQLに比べて可読性が向上し、型安全性が担保されるため、エラーの早期発見も可能になります。

SELECT 文の違い

-- SQL
SELECT * FROM users;
// Prisma
const users = await prisma.user.findMany();
console.log(users);
// Prismaでの取得結果
[
  {"id": 1, "name": "Taro", "age": 25},
  {"id": 2, "name": "Hanako", "age": 30}
]

WHERE 句の違い

-- SQL
SELECT * FROM users WHERE age > 20;
// Prisma
const users = await prisma.user.findMany({
  where: {age: {gt: 20}},
});
// Prismaでの取得結果
[
  {"id": 1, "name": "Taro", "age": 25},
  {"id": 2, "name": "Hanako", "age": 30}
]

JOIN 句の違い

-- SQL
SELECT users.id, users.name, posts.title
FROM users
JOIN posts ON users.id = posts.user_id;
// Prisma
const usersWithPosts = await prisma.user.findMany({
  include: {posts: true},
});
// Prismaでの取得結果
[
  {
    "id": 1,
    "name": "Taro",
    "age": 25,
    "posts": [
      {
        "id": 1,
        "title": "My First Post",
        "content": "Content of the post",
        "userId": 1
      }
    ]
  },
  {
    "id": 2,
    "name": "Hanako",
    "age": 30,
    "posts": [] // 投稿が無い場合
  }
]

ORDER BY 句の違い

-- SQL
SELECT * FROM users ORDER BY age DESC;
// Prisma
const users = await prisma.user.findMany({
  orderBy: {age: 'desc'},
});
// Prismaでの取得結果
[
  {"id": 2, "name": "Hanako", "age": 30},
  {"id": 1, "name": "Taro", "age": 25}
]

INSERT 文の違い

-- SQL
INSERT INTO users (name, age) VALUES ('Taro', 25);
// Prisma
const newUser = await prisma.user.create({
  data: {name: 'Taro', age: 25},
});
// Prismaでの取得結果
{
  "id": 3,
  "name": "Taro",
  "age": 25
}

UPDATE 文の違い

-- SQL
UPDATE users SET age = 30 WHERE id = 1;
// Prisma
const updatedUser = await prisma.user.update({
  where: {id: 1},
  data: {age: 30},
});
// Prismaでの取得結果
{
  "id": 1,
  "name": "Taro",
  "age": 30
}

DELETE 文の違い

-- SQL
DELETE FROM users WHERE id = 1;
// Prisma
await prisma.user.delete({where: {id: 1}});
// Prismaでの取得結果は削除されたユーザーオブジェクト
{
  "id": 1,
  "name": "Taro",
  "age": 30
}

まとめ

Prismaは、型安全・可読性・開発効率を大きく向上させてくれるNode.js向けORMです。 従来のSQL中心の開発では、

  • クエリの記述ミス
  • 型不一致による実行時エラー
  • 複雑なJOINや条件分岐による可読性低下

といった課題がありました。 Prismaを使うことでこれらは大きく改善されます。

Prismaのメリットを振り返ると、

  • スキーマからTypeScript型が自動生成される
  • コンパイル時にエラー検知できる(実行前に気づける)
  • SQLを書かずに直感的にDB操作できる
  • コードの可読性が高く保守しやすい

特にTypeScriptと組み合わせることで、 「安全に・早く・安心して」バックエンド開発ができるのが最大の魅力です。

今後の学習ステップ

Prismaの基礎を理解したら、次は以下に進むのがおすすめです。

  • Migration(DBマイグレーション)
  • Seed(初期データ投入)
  • Transaction(トランザクション処理)
  • Relationの高度な扱い
  • Zodとの連携によるフルスタック型安全

PrismaはモダンなNode.js開発ではほぼ標準ツールと言える存在です。 ぜひ実際のアプリ開発で活用してみてください。

長谷悠大(執筆記事の一覧)

アプリケーションサービス部

猫2匹と暮らしています