【Prisma】DBの操作ができるようになりたい話①
DBの操作ができるようになりたい話①
SQLが書けなくてもDBの操作ができるORMの一つであるprismaを以下のyoutube動画を参考にしながら初めて触ってみた。
【Prisma入門】次世代ORMで簡単にデータベース管理ができるようになろう
この動画では、APIで送信された情報をDBへデータを登録・更新・削除ができるようなアプリケーション
学びが多かったので、忘れないように備忘録としてまとめる。
開発環境
開発環境 | バージョン |
---|---|
express | 4.21.2 |
prisma | 6.4.1 |
MariaDB(mySQL) | 10.4.28 |
node | 20.14.0 |
作業内容
サーバーの準備
nodeが動く環境にて、専用のディレクトリ(今回はPRISMA)を作成。
スクリプトを記述する「server.js」ファイルを作成。
以下のコマンドで、作成したディレクトリをnode.jsのプロジェクトとして初期化し、package.jsonを生成する。
nodemonを使用するために、package.jsonのscriptsにあるstartコマンドを"nodemon server.js"に修正する。
この修正によって、nodemonが機能するようになる。
スクリプトを記述する「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に記述する必要がある。
今回は以下のように記述した。
マイグレーションを実行するには、テーブル定義を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を実際に呼び出してテストする。
その後、実際に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("サーバーが起動中");
});