Prisma で DB テーブルを作成して、Remix でデータを取得する
目的
Remix を使用したフルスタックアプリケーションを開発します。
この記事では、DB にテーブルを作成して、 DB から取得したデータをブラウザに出力します。
環境
環境 | バージョン |
---|---|
Node.js | 20.11.1 |
Yarn | 4.1.1 |
Prisma CLI | 5.11.0 |
Prisma Client | 5.11.0 |
DB にテーブル作成
概要
Prisma CLI を通じて、DB に対しテーブルを作成します。
作業
Prisma CLI と Prisma Client をインストールします。
なお、 Prisma Client はこのセクションで使用しませんが、マイグレーション実行時にインストールされるため、合わせてインストールします。
yarn add -D prisma
yarn add @prisma/client
package.json の scripts に以下の記述を追記します。
{
scripts: {
"db:migrate": "prisma migrate dev",
}
}
schema.prisma ファイルに対して、以下の記述を追記します。
model Post {
id String @id @default(cuid())
title String
content String
}
以下のコマンドを実行し、マイグレーションを実行します。
yarn db:migrate
上記コマンドにより、 schema.prisma の変更内容をマイグレーションファイルとして生成し、DB スキーマに反映します。
この時、マイグレーションファイル名を聞かれるため、スキーマ変更の目的に適した名前を入力してください。
ウィザード質問 | 回答 |
---|---|
Enter a name for the new migration: | init_database |
実行成功すると、 prisma フォルダが以下のような構成になります。
./prisma
├── migrations
│ ├── 20241212343434_init_database
│ │ └── migration.sql
│ └── migration_lock.toml
└── schema.prisma
初期データを用意
概要
初期データがあると、動作確認が容易になります。
DB のマイグレーション実行時に初期データを登録可能にするため、 初期データ登録スクリプトを設定します。
公式リファレンスには ts-node を利用していましたが、私の環境では失敗するため、ts-node と同じことを実現できる tsx を利用します。
作業
初期データ登録用のスクリプトファイルを作成します。
touch prisma/seeds.ts
seeds.ts に以下を記述します。
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
return await prisma.post.create({
data: {
title: 'First Post',
content: 'This is a first post',
},
});
}
main()
.then(async () => {
await prisma.$disconnect();
})
.catch(async (e) => {
console.error(e);
await prisma.$disconnect();
process.exit(1);
});
スクリプト実行用 CLI をインストールします。
yarn add -D tsx
package.json に以下の記述を追記します。
{
"scripts": {
"db:seed": "prisma db seed",
},
"prisma": {
"seed": "tsx prisma/seeds.ts"
},
}
初期データ登録コマンドを実行して完了です。
yarn db:seed
$ prisma db seed
Environment variables loaded from .env
Running seed command `tsx prisma/seeds.ts` ...
🌱 The seed command has been executed.
✨ Done in 1.86s.
余談ですが、GUI アプリで確認すると、初期データが追加されたことを確認できます。
Prisma Client でデータを出力
概要
Remix で作成した初期データを取得します。
ここでは、 Prisma を通じて DB からデータを取得し、コンソールに出力します。
作業
app/routes/_index.tsx ファイルを以下のコードと置換します。
import { Post, PrismaClient } from '@prisma/client';
import { json, type MetaFunction } from '@remix-run/node';
import { useLoaderData } from '@remix-run/react';
export const meta: MetaFunction = () => {
return [
{ title: 'Remix fullstack blog' },
{ name: 'description', content: 'Remix fullstack blog' },
];
};
export const loader = async () => {
const prisma = new PrismaClient();
const posts = await prisma.post.findMany();
return json(posts);
};
export default function Index() {
const posts: Post[] = useLoaderData();
console.log({ posts });
return (
<div>
<h1>Welcome to Remix fullstack blog</h1>
</div>
);
}
Remix 開発サーバを起動します。
yarn dev
アプリを開き開発者ツールを確認して、データ出力を確認すると完了です。
open http://localhost:5173/
おまけ: DB リセット方法
概要
いつか、開発用 DB に不要データが蓄積され、 DB をリセットの衝動が発生する可能性があります。
その時に備えて、DB をリセットするコマンドを設定しておきます。
作業
package.json に以下の記述を追記します。
{
"scripts": {
"db:migrate:reset": "prisma migrate reset --force",
},
}
以下のコマンドを実行すると、DB をリセットして、マイグレーションを再実行します。
リセット時、合わせて seed コマンドも実行されます。
yarn db:migrate:reset
まとめ
実装コードは以下 PR の通りです。
参考 URL
- DB にテーブル作成
- seed データを用意
- DB リセット方法
Discussion