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.user
のuser
部分はモデル名(テーブル名)に置き換えてください。
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 } }) |