こもるーとたぬきの備忘録

profile

【Prisma】DBの操作ができるようになりたい話①

DBの操作ができるようになりたい話①
SQLが書けなくてもDBの操作ができるORMの一つであるprismaを以下のyoutube動画を参考にしながら初めて触ってみた。
【Prisma入門】次世代ORMで簡単にデータベース管理ができるようになろう
この動画では、APIで送信された情報をDBへデータを登録・更新・削除ができるようなアプリケーション
学びが多かったので、忘れないように備忘録としてまとめる。

開発環境

開発環境バージョン
express4.21.2
prisma6.4.1
MariaDB(mySQL)10.4.28
node20.14.0

作業内容

サーバーの準備

nodeが動く環境にて、専用のディレクトリ(今回はPRISMA)を作成。
スクリプトを記述する「server.js」ファイルを作成。
以下のコマンドで、作成したディレクトリをnode.jsのプロジェクトとして初期化し、package.jsonを生成する。

    npm init -y
  
以下のコマンドで、必要なパッケージをインストールする。

    npm i prisma express nodemon @prisma/client
  
nodemonは、Node.jsのスクリプトを監視して、ファイルに更新があれば自動で再起動してくれるパッケージ
nodemonを使用するために、package.jsonのscriptsにあるstartコマンドを"nodemon server.js"に修正する。
この修正によって、nodemonが機能するようになる。

DBの準備

xamppを使用して、ローカルにMariaDBを立ち上げる。
今回の学習用のDBを作成。
prismaを使用してもテーブルを作成することはできるため、DBの準備はここまで。

サーバーとDBの接続

作成しているスクリプトにおいて、prismaは、サーバーとDBを接続する役割を果たしている。
ここまででサーバーとDBの準備が完了しているので、prismaを使用してサーバとDBの接続を行う。


    npx prisma init
  

上記のコマンドで、Prismaを初期化。 正常に動作すると

  • Prismaディレクトリが生成される。
  • Prismaディレクトリの直下にschema.prisma ファイルを生成される。
  • (なければ).envファイルが生成され、DATABASE_URL というDB接続情報を管理する環境変数が追加される。
prisma/schema.prismaファイルを開き、以下のようにプロバイダーの項目をmySQLにする。

    datasource db {
        provider = "mysql"
        url      = env("DATABASE_URL")
    }
  
次に、DATABASE_URLを以下を参考に編集する。

    DATABASE_URL="mysql://ユーザー名:パスワード@ホスト:ポート/データベース名"
  
接続設定が完了したら、prismaを使用して、DBにテーブルを作成するマイグレーションコマンドを実行したい。
マイグレーションを実行するには、テーブル定義をschema.prismaに記述する必要がある。
今回は以下のように記述した。

    model Posts {
        id Int @default(autoincrement()) @id
        title String
        body String
      }
  
以下のコマンドを実行してマイグレーションを実行

    npx prisma migrate dev --name init
  

正常に機能するとDBにテーブルが作成される。
以下のコマンドを使用すると、ブラウザが立ち上がり、DBの中身をローカルで確認することができる。


    npx prisma studio
  

ここまで、Prismaを使用したサーバとDBの接続が完了する。

テーブルを操作するAPIの実装

サーバとDBの接続が完了したら、テーブルを操作するスクリプトを以下のように記述する。
その後、実際にDBの内容が更新されるかどうかAPIを実際に呼び出してテストする。

    const { PrismaClient } = require("@prisma/client");  
    const express = require("express");

    const app = express();
    const PORT = 8000;

    // PrismaClientのインスタンス生成
    const prisma = new PrismaClient();
    // ミドルウェアの設定
    app.use(express.json());

    // DBのデータを全て取得するAPI
    app.get("/", async (req, res) => {
    const posts = await prisma.posts.findMany();
      return res.json(posts);
    });

    // 特定のIDを持つデータを取得するAPI
    app.get("/:id", async (req, res) => {
      const id = req.params.id;
      const post = await prisma.posts.findUnique({
        where: {
          id: Number(id),
        },
      });
      return res.json(post);
    });

    // DBへのデータ登録するAPI
    app.post("/", async (req, res) => {
      const { title, body } = req.body;
      const posts = await prisma.posts.create({
        data: {
          title: title,
          body: body,
        },
      });
      return res.json(posts);
    });

    // DBのデータを更新する関数
    app.post("/updata", async (req, res) => {
      const { id, title, body } = req.body;
      const upDatePost = await prisma.posts.update({
        where: {
          id: Number(id),
        },
        data: {
          title: title,
          body: body,
        },
      });
      return res.json(upDatePost);
    });

    app.get("/delete/:id", async (req, res) => {
      const id = req.params.id;
      const deletePost = await prisma.posts.delete({
        where: {
          id: Number(id),
        },
      });
      return res.json({
        message: `${id}の削除が完了しました。`,
      });
    });

    app.listen(PORT, () => {
      console.log("サーバーが起動中");
    });
  

参考