なかなか使う機会がなかったのですが、本サイトに実装したい機能を思いついて、それにPrismaが使えそうだなーと思ったので、入門してみました。
機能に関しては別途書きたいですが、その前にPrismaについて学んだことを残しておこうと思います。
Prismaとは
Node.js/TypeScript環境で利用できるオープンソースのORM(Object-relational mapping)です。
ORMは、SQLの代わりにオブジェクトのメソッドを通して、データベースの操作を行うことができるというものですね。
clientの定義方法
clientの定義方法に関しては、公式がBest Practiceを載せてくれていました。
prisma.tsimport { PrismaClient } from '@prisma/client' const globalForPrisma = global as unknown as { prisma: PrismaClient | undefined } export const prisma = globalForPrisma.prisma ?? new PrismaClient({ log: ['query'], }) if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
いくつかの記事などを参考にして、lib/prisma.tsに当該コードを置くようにしました。
使い方
設定方法などは公式や他記事がたくさん出ているので、ここでは軽く使い方のみを書きます。
initすると作成されるschema.prismaファイルにテーブルの構造を定義していきます。
例えば、Postテーブルを作りたければ以下のようにスキーマを定義します。
schema.prismamodel Post { id Int @id @default(autoincrement()) title String description String }
Prismaに関しての知識がなくても見ればわかるくらい直感的ですね。
npx prisma db pushコマンドを実行することで実際にDBにテーブルを作ることができます。
Postテーブルのレコードを取得したい場合には以下のように書きます。
const posts = await prisma.post.findMany();
これまたすごく直感的です。
findMany()はリスト形式でレコードを取得するメソッドです。
付与できるオプションやその他のメソッドに関しても公式にしっかり書いてありますので、ぜひご一読ください。
データベースのコネクタ
これも公式に書いてあるとおりですが、各DB特有のデータ型や機能を使うためのコネクタが用意されています。
上述のPostテーブルの例で言えば、descriptionカラムをMySQLのtext型にしたいといった場合の話です。
これは、以下のようにschema.prismaに定義することで実現できます。
schema.prismamodel Post { ... description String @db.Text ... }
終わりに
今回実現したい機能的に、そこまで深く潜る必要がなかったのでだいぶあっさりした内容になってしまいました。
勢いのあるORMだけあって、情報が非常に充実していてキャッチアップしやすかったです。
機会があればTypeORMとか他のも触って比較みたいなこともしてみたいなーと思いました。