カテゴリ: TypeScript 更新日: 2026/06/22

TypeScriptとPrismaで型安全なDB操作を完全攻略!Node.jsとExpressを使った初心者向けバックエンド開発超入門

TypeScriptとPrismaで型安全なDB操作を行う方法
TypeScriptとPrismaで型安全なDB操作を行う方法

先生と生徒の会話形式で理解しよう

生徒

「TypeScriptとPrismaを使うと、データベースの操作が安全にできるって聞いたのですが、どういう意味ですか?」

先生

「TypeScriptの型の仕組みとPrismaという便利な道具を組み合わせることで、データの名前間違いや値の種類のミスを、プログラムを動かす前に自動で発見できるようになるんですよ。」

生徒

「プログラムが動く前に間違いがわかるのは凄いです!難しそうですが、パソコン初心者でも作れますか?」

先生

「大丈夫です。基本的な概念から順番に、簡単な仕組みと実際のプログラムを動かしながら一緒に学んでいきましょう!」

1. バックエンド開発とデータベースの基本

1. バックエンド開発とデータベースの基本
1. バックエンド開発とデータベースの基本

ウェブサイトやスマートフォンのアプリを動かすとき、画面の裏側で見えない処理を行う仕組みのことをバックエンド開発サーバーサイド開発と呼びます。普段私たちが目にする画面がフロントエンドと呼ばれるのに対し、バックエンドはデータの管理や計算などの重要な役割を担っています。

このバックエンド開発で最も重要になるのが、データを保存しておく箱であるデータベース(略してDB)です。データベースには、ユーザーの名前、パスワード、投稿された写真やコメントなど、ありとあらゆる重要な情報が保管されています。このデータベースから必要な情報を取り出したり、新しい情報を新しく追加したり、古い情報を書き換えたりする作業が、バックエンド開発の基本となります。

今回は、世界中で広く使われているNode.js(ノードジェーエス)という仕組みと、ウェブサーバーを簡単に構築できるExpress(エクスプレス)という枠組みを使って、データベースを動かす方法を学んでいきます。初心者の方でも、一つずつ順番に進めれば必ず理解できるようになりますので、まずはこの全体像をイメージしてみてください。

2. TypeScriptと型安全のメリット

2. TypeScriptと型安全のメリット
2. TypeScriptと型安全のメリット

プログラムを書くとき、一番怖いのは「バグ」と呼ばれるプログラムの間違いや誤動作です。特にデータベースを操作するときに、登録したいデータの種類を間違えてしまうと、システム全体が壊れてしまう原因になります。そこで活躍するのがTypeScript(タイプスクリプト)というプログラミング言語です。

TypeScriptの最大の特徴は、データに(かた)を決めることができる点です。型とは、そのデータが「文字」なのか「数字」なのかという情報の種類のことです。例えば、ユーザーの年齢を入れる場所に、間違えて「こんにちは」という文字を入れてしまおうとしたとき、TypeScriptはプログラムを実行する前に「ここには数字しか入れられませんよ」と赤線を出して教えてくれます。このように、型によってプログラムの安全性が守られている状態を型安全(かたあんぜん)と呼びます。

これまでのプログラミングでは、実際にシステムを動かしてみて初めて間違いに気づくことが多かったのですが、TypeScriptを使うことで、キーボードで文字を打ち込んでいるその瞬間に間違いを修正できるようになります。これにより、開発のスピードが上がり、初心者でもミスが圧倒的に少ない安全なプログラムを組み立てることができます。

3. Prismaとは何か

3. Prismaとは何か
3. Prismaとは何か

データベースを操作するためには、本来であればデータベース専用の難しい言語を覚える必要があります。しかし、プログラミング初心者にとって、新しい言語をいくつも同時に勉強するのは非常に大変です。そこで登場するのが、Prisma(プリズマ)という非常に便利な道具です。

Prismaは、ORM(オーアールエム)と呼ばれる仕組みの一種です。これは、データベースの複雑な命令を、私たちが普段使っているTypeScriptの書き方に翻訳してくれる翻訳係のような存在です。Prismaを使うと、データベースの専門知識が少なくても、まるでパズルを組み合わせるように簡単にデータの追加や読み込みができるようになります。

さらに、Prismaの最大の強みは、先ほど説明したTypeScriptと完全に合体できることです。データベースの形に合わせて、自動的にTypeScriptの型を作ってくれるため、データベースを操作するときも常に強力な型安全の恩恵を受けることができます。データの項目名を少しでも打ち間違えると、すぐにエラーとして教えてくれるため、安心してデータベースの操作を行うことができます。

4. 環境構築とPrismaの初期設定方法

4. 環境構築とPrismaの初期設定方法
4. 環境構築とPrismaの初期設定方法

それでは、実際に開発を始めるための準備について解説します。バックエンドの開発を行うためには、まず自分のパソコンに開発環境を作る必要があります。最初は難しく感じるかもしれませんが、決まった命令を順番に入力していくだけで完了します。

まず、プロジェクトを始めるための初期化を行います。パソコンのコマンドを入力する画面で、必要な部品をダウンロードする命令を実行します。次に、Prismaを使えるようにするための初期化の命令を動かします。これにより、プロジェクトの中に設定ファイルが自動的に作られます。特に重要なのが、データベースの設計図を書き込むためのファイルです。これをスキーマファイルと呼びます。

このスキーマファイルに、どのようなデータを保存するのかというルールを記述していきます。例えば、ユーザーの情報を保存するテーブルを作る場合は、識別するための番号、名前、メールアドレスといった項目を定義します。この設計図を元にして、Prismaがデータベースの実体と、TypeScriptで使うための型を同時に自動生成してくれます。


// prisma/schema.prisma ファイルのイメージ
// データベースの設計図をこのように記述します
datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id    Int    @id @default(autoincrement())
  name  String
  email String @unique
}

5. Prismaを使ったデータの登録処理

5. Prismaを使ったデータの登録処理
5. Prismaを使ったデータの登録処理

準備が整ったら、いよいよデータベースに新しいデータを保存するプログラムを書いてみましょう。データを新しく作り出す操作のことを、専門用語でクリエイト処理挿入と呼びます。

Prismaを使ってユーザーを登録する場合、専用の関数を呼び出します。このとき、TypeScriptの型安全が強力に働きます。もし設計図で決めた名前やメールアドレスの項目を忘れていたり、数字を入れるべき場所に文字を入れていたりすると、開発ツールがすぐに警告を出してくれます。以下のコードは、新しくユーザーを作成する最もシンプルなプログラムの例です。


import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function createUser() {
    // データベースに新しいユーザーを一人追加します
    const newUser = await prisma.user.create({
        data: {
            name: "山田太郎",
            email: "yamada@example.com",
        },
    });
    console.log("登録されたユーザー:", newUser);
}

createUser();

上記のプログラムを実行すると、Prismaが自動的にデータベースへ接続し、安全にデータを保存してくれます。実行結果は以下のようになり、自動的に番号が割り振られて保存されたことが確認できます。


登録されたユーザー: { id: 1, name: '山田太郎', email: 'yamada@example.com' }

6. データの取得と検索の仕組み

6. データの取得と検索の仕組み
6. データの取得と検索の仕組み

データベースにデータを保存できたら、次はそのデータを取り出す方法を学びましょう。データを取り出す操作のことを取得検索と呼びます。すべてのデータをまとめて持ってきたり、特定の条件に合うデータだけを絞り込んで持ってきたりすることができます。

Prismaでは、すべてのデータを取得するための関数や、特定の条件に一致するデータを見つけるための関数が用意されています。ここでも型安全の機能が働いているため、取り出したデータの中にどのような項目が含まれているかを、プログラムが最初から知っています。そのため、データを取り出した後の処理も迷うことなくスムーズに書くことができます。


import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function findUsers() {
    // データベースからすべてのユーザーのリストを取得します
    const allUsers = await prisma.user.findMany();
    console.log("全員のデータ:", allUsers);

    // メールアドレスが一致する特定のユーザーを一人だけ検索します
    const singleUser = await prisma.user.findUnique({
        where: {
            email: "yamada@example.com",
        },
    });
    console.log("検索されたユーザー:", singleUser);
}

findUsers();

このプログラムを動かすと、先ほど登録したデータが綺麗に整理された形で画面に表示されます。一覧のデータは配列と呼ばれるリストの形式で返ってきます。


全員のデータ: [ { id: 1, name: '山田太郎', email: 'yamada@example.com' } ]
検索されたユーザー: { id: 1, name: '山田太郎', email: 'yamada@example.com' }

7. データの更新と削除の方法

7. データの更新と削除の方法
7. データの更新と削除の方法

データベースの操作で最後に行うのが、既存のデータの書き換えと消去です。データの書き換えのことを更新(アップデート)、消去のことを削除(デリート)と呼びます。ユーザーが登録した名前を変更したいときや、アカウントを消したいときにこれらの処理を行います。

更新や削除を行うときは、「どのデータを対象にするか」という指定が非常に重要になります。指定を間違えると、別のユーザーのデータを上書きしてしまったり、全員のデータを消してしまったりする危険があるからです。Prismaでは、一意の番号などを鍵として指定することで、狙ったデータだけを安全に変更または削除することができます。ここでも、存在しない項目を指定しようとすると型エラーになるため、安全性が高く保たれています。


import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function updateAndDeleteUser() {
    // 番号が1番のユーザーの名前を新しい名前に書き換えます
    const updatedUser = await prisma.user.update({
        where: { id: 1 },
        data: { name: "山田次郎" },
    });
    console.log("更新後のデータ:", updatedUser);

    // 番号が1番のユーザーをデータベースから削除します
    const deletedUser = await prisma.user.delete({
        where: { id: 1 },
    });
    console.log("削除されたデータ:", deletedUser);
}

updateAndDeleteUser();

このプログラムを実行すると、まず名前が変更され、その後にデータそのものが消去されます。削除されたデータが最後に画面に表示され、無事に作業が完了したことがわかります。


更新後のデータ: { id: 1, name: '山田次郎', email: 'yamada@example.com' }
削除されたデータ: { id: 1, name: '山田次郎', email: 'yamada@example.com' }

8. Expressと組み合わせた実践的なAPI開発

8. Expressと組み合わせた実践的なAPI開発
8. Expressと組み合わせた実践的なAPI開発

ここまでは個別のプログラムとして動かしてきましたが、実際のバックエンド開発では、ウェブブラウザなどからの要求を受け取って、それに応じた結果を返す仕組みを作ります。この仕組みのことをAPI(エーピーアイ)と呼びます。今回は、Expressというフレームワークを使って、簡単なAPIを作ってみましょう。

Expressを使うと、「このURLにアクセスが来たら、この処理を行う」というルールを簡単に決めることができます。そこにPrismaのデータベース操作を組み込むことで、インターネットを通じて外部からデータを登録したり取得したりできる、本物のバックエンドシステムが完成します。エラーが発生したときの対策も一緒に入れておくことで、より頑丈なシステムになります。


import express from 'express';
import { PrismaClient } from '@prisma/client';

const app = express();
const prisma = new PrismaClient();

// 届いたデータを解析するための設定です
app.use(express.json());

// ユーザー一覧を返すAPIの窓口です
app.get('/users', async (req, res) => {
    try {
        const users = await prisma.user.findMany();
        res.json(users);
    } catch (error) {
        res.status(500).json({ message: "エラーが発生しました" });
    }
});

// サーバーを起動して待ち受け状態にします
app.listen(3000, () => {
    console.log("サーバーがポート3000で起動しました");
});

このプログラムを起動すると、パソコンの中でWebサーバーが動き始めます。ブラウザや専用の道具を使ってアクセスすることで、データベースの中身をいつでも確認できるようになります。これで、TypeScriptとPrismaを使った型安全なバックエンド開発の第一歩を踏み出すことができました。

関連記事:
カテゴリの一覧へ
新着記事
New1
JavaScript
JavaScriptのスコープとは?ローカル変数・グローバル変数の違いと使い分け
New2
TypeScript
TypeScriptで型の合成時に発生する型エラーの対処法を徹底解説!初心者にもわかりやすく解説
New3
TypeScript
TypeScriptでAPI呼び出しをラップするユーティリティ関数の設計完全ガイド!初心者向けにAxiosやFetchの使い方を解説
New4
TypeScript
TypeScriptのMapped Typesとインターフェースの連携方法を徹底解説!初心者でも理解できる型変換の基本
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのループで無限ループが起きる原因と対策を初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptの文字列の長さを取得する(lengthプロパティ)
No.4
Java&Spring記事人気No4
TypeScript
TypeScriptのファイル分割とimport/exportの基本を徹底解説!初心者でも安心のやさしい入門
No.5
Java&Spring記事人気No5
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptでクエリパラメータを取得する方法を完全解説 URLSearchParamsの使い方を初心者向けに丁寧に説明
No.7
Java&Spring記事人気No7
TypeScript
TypeScriptでパスエイリアスを設定する方法!baseUrlとpathsでコードをスッキリ整理
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】