Prisma

プリズマ

Prisma を分かりやすく

Prismaとは、Node.jsやTypeScriptのための次世代のデータベースクライアントで、開発者がデータベースと簡単にやりとりできるように設計されています。SQLやNoSQLなど様々なデータベースに対応していて、APIを介してデータベースにクエリを投げたり、取得したりすることが可能です。

Prismaを使うと、データベースとの通信が一気に楽になるんですよ。じゃあ、Prismaを使わないとどうなるか?それを分かりやすく例えてみますね。

想像してみてください。あなたが一人で複雑な道路を走っているとします。道路は曲がりくねっていて、交通のルールがたくさんありますよね。それがデータベースとの通信だと思ってください。色々なクエリを書かなければならず、それぞれのデータベースによってルールが違ったりする。そんな状況です。

でも、Prismaがあれば、まるで専用のナビゲーションシステムがあるかのようです。それがあなたの代わりに複雑なルートを計算し、最適な道筋を提案してくれるんです。また、交通ルールについても知らせてくれますから、迷うことなくスムーズに目的地に到達できます。そんな感じですね。

一体ナンノコッチャ?って思うかもしれませんが、基本的には「データベースへの道案内役」だと思ってもらえれば大丈夫ですよ。凄くないですか?ここまで大丈夫ですか?

結論

Prisma(プリズマ)は、TypeScript や JavaScript で書かれたデータベースツールであり、クエリやマイグレーションなどを簡単に扱えるようにするためのライブラリです。Prisma は、オープンソースで開発され、データベースの種類に依存しない API を提供します。

Prisma のメリット

Prisma は TypeScript と JavaScript のための強力な型安全なデータベースクライアントを提供します。これにより、開発者はコンパイル時にエラーを検出でき、デバッグ時間を節約し、ランタイムエラーを減らすことができます。また、データベーススキーマを定義するための独自のスキーマ言語、PSL を提供します。これにより、データベースのテーブル、リレーション、インデックスなどを簡単に定義できます。

PostgreSQL、MySQL、SQLite、SQL Server など、多くの人気のある SQL データベースをサポートしています。そして、速度と効率性を重視して設計されており、大量のデータに対しても高速なクエリが可能です。

次は公式サイトに書いてあるソースコードです。NestJS アプリケーションで Prisma クライアントをラップし、アプリケーションのライフサイクルに合わせてデータベース接続を管理するためのサービスを定義しています。

import { Injectable, OnModuleInit, INestApplication } from '@nestjs/common'
import { PrismaClient } from '@prisma/client'

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    await this.$connect()
  }

  async enableShutdownHooks(app: INestApplication) {
    this.$on('beforeExit', async () => {
      await app.close()
    })
  }
}

NestJS Database & Prisma | Type-safe ORM for SQL Databases

Prisma の使い方

以下は、Prisma を使った例を紹介します。

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const users = await prisma.user.findMany({
    where: {
      age: {
        gt: 18,
      },
    },
    orderBy: {
      name: 'asc',
    },
  })

  console.log(users)
}

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

この例では、Prisma を使って、データベースから年齢が 18 歳を超えるユーザーを取得しています。Prisma は、データベースへのクエリをシンプルにするために、ORM(Object-Relational Mapping)と呼ばれる機能を提供します。この例では、prisma.user.findManyを使って、users テーブルから年齢が 18 歳を超えるユーザーを取得しています。また、orderBy を使って、名前を昇順で並び替えています。

最後に、取得したユーザーをコンソールに表示しています。

このように、Prisma を使うことで、データベースへのクエリをシンプルにすることができます。また、Prisma は、データベースの種類に依存しない API を提供するため、データベースを変更する際にも、アプリケーションの変更を最小限に抑えることができます。