Prismaのキャッチアップで、自分用のメモを作成
Prismaとは
今回はPrisma ORMを試します。Prisma ORMは、Node.jsとTypescriptのO/Rマッパー。ちょっと前から話題になっています。
Node.jsとTypescriptのO/Rマッパーでは、Squelizeがよく使われています。
違いとしては、
Sequelizeの方が、コミュニティが発達している、ドキュメント量が多い、安定性が高い、対応しているリレーショナルデータベースも多い
Prismaは、タイプセーフなインターフェースになっている(最初から型を使った開発者エクスペリエンスを意識して開発がされていそう)
あたりがあるかと思います。
CLIについては、Sequelizeも様々パッケージがあるので、どちらかの方が優秀という感じはしませんでした。
現時点では、大規模な開発であれば、Sequelizeを選ぶ方が無難という感じはします。
今回は、学習のためにもPrismaを試します。
使い方メモ
CRUDの実装などの初歩的な部分はわかりやすいので、ここには記載しません。
モデルのカスタムのstaticメソッド
Extensions
のmodel
が該当していそう
https://www.prisma.io/docs/orm/prisma-client/client-extensions/model
例えば、customersのモデルで、nameフィールドで検策するメソッドを作る場合は、下記のように書きます
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient().$extends({
model: {
customers: {
async findByName(name: string) {
return await prisma.customers.findMany({ where: { name }});
}
}
}
})
const data = await prisma.customers.findByName('hogehoge');
モデルのカスタムのinstanceメソッド
Extensions
のresult
が該当していそう
https://www.prisma.io/docs/orm/prisma-client/client-extensions/result
例えば、customersのモデルで、nameフィールドから表示用の名前を取得するメソッドを作る場合は、下記のように書きます
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient().$extends({
result: {
customers: {
fullName: {
needs: { id: true, name: true },
compute(customer) {
return `${customer.id} ${customer.name}`;
}
}
}
}
})
const data = await prisma.customers.findByName('hogehoge');
const fullName = data[0].fullName;
モデルのhook処理
Extensions
のquery
が該当していそう
https://www.prisma.io/docs/orm/prisma-client/client-extensions/query
例えば、customersのモデルで、customersを作成した時、タイムスタンプを設定するhook処理を実装する場合は下記のように書きます
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient().$extends({
query: {
customers: {
async create({ model, operation, args, query }) {
return query({
...args,
data: {
...args.data,
timestamp: now,
}
});
}
}
}
})
await prisma.customers.create({ data: { name: 'hogehoge' }});
マイグレーションのコマンド
マイグレーションファイルの作成と適用
開発環境向け
注意:Prismaのスキーマ定義型ファイルで、DBのスキーマが変わるので、PrismaのスキーマファイルとDBのスキーマで差分がある場合は、実行しない
$ npx prisma migrate dev
マイグレーションファイルの適用
$ npx prisma migrate deploy
警告がなかったり、シャドウデータベースに依存せず、マイグレーションを行う
DBのスキーマからDBマイグレーションファイルの作成
$ npx prisma db pull
スキーマの検証
$ npx prisma format
失敗したマイグレーションの適用済みorロールバック済みにする
$ npx migrate resolve
--applied(適用済みにする) or --rolled-back(ロールバック済みにする) を指定する
マイグレーションの状態を確認
$ npx prisma migrate status
一旦、ここまで
Prisma Accelerateあたりを読んで面白かったら書きます。