Featured image of the post

Next.js×prisma×rds実装時メモ(ローカル検証用のdockerもちょっと?)

aws rdsを用いたアプリの実装の際、ローカル検証用にdockerでDBを立ち上げれるようにしたが、ローカルではローカルDBに、本番環境ではrdsに接続を分ける方法があまり思い当たらずいろいろ調べて得れた知見をまとめました

1. データベース接続までの流れ (基本ステップ)

新しいプロジェクトや環境でDBに接続する際の、基本的な手順です。

ステップ1: 必要なライブラリをインストール
# PrismaのCLIツール
npm install prisma --save-dev

# アプリケーションで使うPrisma Client
npm install @prisma/client

ステップ2: Prismaの初期設定

プロジェクトのルートで実行し、prismaディレクトリと.envファイルを作成します。

npx prisma init

ステップ3: 接続情報の設定 (.envファイル)

.envファイルにデータベースの接続URLを記述します。このURLを書き換えるだけで、ローカルDBと本番RDSを切り替えられます。

mysqlの場合はPORTは3306がデフォルトなそうで

# .env

# MySQL / MariaDBの場合
DATABASE_URL="mysql://USER:PASSWORD@HOST:PORT/DATABASE"

# PostgreSQLの場合
# DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE"

ステップ4: スキーマファイルの修正とDB構造の反映

prisma/schema.prismaファイルを開き、datasourceブロックのproviderが正しいか確認します。(例: mysql

// prisma/schema.prisma

datasource db {
  provider = "mysql" // "postgresql" や "sqlite" など
  url      = env("DATABASE_URL")
}

その後、以下のコマンドで既存のデータベース構造をschema.prismaに自動で反映させます。

npx prisma db pull

ステップ5: Prisma Clientの生成

スキーマ情報が更新されたので、それに基づいた型安全なクライアントを生成します。スキーマを編集したら必ず実行してください。

npx prisma generate

ステップ6: Prisma Clientのインスタンス化

アプリケーション全体で単一のPrisma Clientインスタンスを共有するための設定です。(例: lib/prisma.ts

// lib/prisma.ts
import { PrismaClient } from '@prisma/client';

declare global {
  var prisma: PrismaClient | undefined;
}

export const prisma = global.prisma || new PrismaClient();

if (process.env.NODE_ENV !== 'production') {
  global.prisma = prisma;
}

これで、APIルートなどから import { prisma } from '@/lib/prisma' として呼び出せば、いつでもDB操作が可能です。

2. Prisma CLI よく使うコマンド

ターミナルで使う便利なコマンドです。

コマンド 説明
npx prisma init Prismaの初期設定を行います。(prismaディレクトリと.envを作成)
npx prisma db pull 既存のデータベースの構造をschema.prismaファイルに反映させます。
npx prisma migrate dev schema.prismaの変更を元にマイグレーションファイルを作成し、DBに適用します。(自分でテーブル構造を変更する際はこちらを使います)
npx prisma generate schema.prismaを元に@prisma/clientを更新し、型定義などを最新化します。
npx prisma studio ブラウザでデータベースの中身を直接表示・編集できるGUIツールを起動します。非常に便利です。

3. Prisma Client 関数チートシート (CRUD操作)

アプリケーションコード内で使う、データ操作のための主要な関数です。prisma.useruser部分はモデル名(テーブル名)に置き換えてください。

Read (読み取り)
メソッド 説明 使用例
findUnique @id@uniqueキーで1件のレコードを取得します。 prisma.user.findUnique({ where: { id: 1 } })
findFirst 条件に一致する最初の1件のレコードを取得します。 prisma.post.findFirst({ where: { published: true } })
findMany 条件に一致する全てのレコードをリストで取得します。 prisma.user.findMany({ where: { name: '宮本' } })
Create (作成)
メソッド 説明 使用例
create 新しいレコードを1件作成します。 prisma.user.create({ data: { email: '[email protected]', name: 'A' } })
createMany 複数のレコードをまとめて作成します。 prisma.user.createMany({ data: [ {..}, {..} ] })
Update (更新)
メソッド 説明 使用例
update 条件に一致する1件のレコードを更新します。 prisma.user.update({ where: { id: 1 }, data: { name: '一路' } })
updateMany 条件に一致する全てのレコードを一括更新します。 prisma.post.updateMany({ where: { published: false }, data: { published: true } })
upsert レコードがあれば更新(Update)、なければ作成(Insert)します。 prisma.user.upsert({ where: { email: '[email protected]' }, update: {..}, create: {..} })
Delete (削除)
メソッド 説明 使用例
delete 条件に一致する1件のレコードを削除します。 prisma.user.delete({ where: { id: 1 } })
deleteMany 条件に一致する全てのレコードを一括削除します。 prisma.post.deleteMany({ where: { authorId: 5 } })
その他便利な操作
メソッド 説明 使用例
groupBy 特定のフィールドでレコードをグループ化し、集計します。 prisma.user.groupBy({ by: ['country'], _count: { id: true } })
where 絞り込み条件を指定します。(AND, OR, NOT, in, containsなど) findMany({ where: { OR: [{..}, {..}] } })
orderBy 結果の並び順を指定します。 findMany({ orderBy: { createdAt: 'desc' } })
select 取得するフィールドを限定します。 findUnique({ where: {id:1}, select: { id: true, email: true } })
include 関連するテーブルのデータも同時に取得します。(リレーション) findUnique({ where: {id:1}, include: { posts: true } })

宮本一路の画像

宮本一路

GitHubのロゴ

winc63代目幹事長