0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Prisma使い方メモ

Posted at

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メソッド

Extensionsmodelが該当していそう
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メソッド

Extensionsresultが該当していそう
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処理

Extensionsqueryが該当していそう
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あたりを読んで面白かったら書きます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?