Jump to content

Prisma

Prisma は TypeScript のための ORM で、schema.prismaファイルでデータベーススキーマとモデルを定義し、バックエンドからデータベースとやり取りするための型安全なクライアントを生成することができます。

Prisma Client

src/server/db.tsにある Prisma Client は、グローバル変数としてインスタンス化され(Prisma チームがベストプラクティスとして推奨)、API ルートで使用するためにエクスポートされます。Prisma クライアントは、デフォルトで コンテキスト に含まれており、各ファイルで個別にインポートするのではなく、こちらを使用することを推奨します。

スキーマ

Prisma のスキーマファイルは、/prisma/schema.prismaにあります。このファイルでデータベーススキーマとモデルを定義し、Prisma クライアントを生成する際に使用されます。

NextAuth.js と組み合わせた場合

NextAuth.js と Prisma を組み合わせて選択すると、User, Session, Account, VerificationTokenモデルの推奨値がNextAuth.js ドキュメントに従って設定されてスキーマファイルが生成されます。

デフォルトのデータベース

デフォルトのデータベースは SQLite データベースで、開発や PoC(概念実証) を素早く行うのには適していますが、本番環境での使用はお勧めできません。使用するデータベースを変更するには、datasource ブロックの providerpostgresql または mysql に変更し、環境変数内の接続文字列でデータベースを指定します。

データベースのシーディング

データーベースのシーディング(訳註: データベース構築時にダミーデータや初期データを投入すること)は、データベースに素早くテストデータを投入して開始するのにとても役立ちます。シーディングを設定するには、/prismaディレクトリに seed.ts ファイルを作成し、シードスクリプトを package.json ファイルに追加する必要があります。また、シードスクリプトを実行できる TypeScript ランナーも必要です。TypeScript ランナーには、esbuild を使用し、ESM 設定を必要としない非常にパフォーマンスの高い tsx をお勧めしますが、ts-nodeやその他のランナーも使えます。

package.json
{
  "scripts": {
    "db-seed": "NODE_ENV=development prisma db seed"
  },
  "prisma": {
    "seed": "tsx prisma/seed.ts"
  }
}
prisma/seed.ts
import { prisma } from "../src/server/db";

async function main() {
  const id = "cl9ebqhxk00003b600tymydho";
  await prisma.example.upsert({
    where: {
      id,
    },
    create: {
      id,
    },
    update: {},
  });
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });

その後、pnpm db-seed (または npm/yarn) を実行して、データベースへのシーディングを実行します。

お役立ち情報

リソースリンク
Prisma ドキュメントhttps://www.prisma.io/docs/
Prisma GitHubhttps://github.com/prisma/prisma
Prisma マイグレーションプレイグラウンドhttps://playground.prisma.io/guides
NextAuth.JS Prisma アダプタhttps://next-auth.js.org/adapters/prisma
PlanetScale 接続ガイドhttps://www.prisma.io/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases/connect-your-database-typescript-planetscale