BlackCoffy

prisma clientを使ってみた。CRUD編

prismaの基本的な使い方。Postgresql使ってます。

初期設定

prismaをインストール

npm install prisma --save-dev
npx prisma

prisma initで必要なファイル(.envとschema.prisma)を作ります

npx prisma init

.envを環境に合わせて編集

DATABASE_URL=postgresql://<USER>:@localhost:5432/<DATABASE>

prisma/schema.prismaを編集。prisma schema

model部分にテーブルの情報を書きます。Data model

datasource db {
  url      = env("DATABASE_URL")
  provider = "postgresql"
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  email     String   @unique
  name      String?
}

prisma client

@prisma/clientをインストール

npm install @prisma/client

prisma client

prisma clientのコードを生成

generateコマンドでprisma clientのコードを作ってくれます (node_modules/@prisma/client/にファイルができる)

npx prisma generate

データベースのマイグレーション

データベースのテーブルを生成、変更するコマンド。

—nameの後は、コメントなので、schemaファイルを変更してマイグレーションする時はname部分も変更する

npx prisma migrate dev --name init

テーブルのスキーマを変更した時はgenerateしないと、typescriptのエラーが出る

npx prisma generate

他のプロジェクトでprismaを使う時は、db pullコマンドでschema.prismaをダウンロードできる (最低限のschema.prismaは必要なので、npx prisma initは実行しておく)

printオプションを付けると、内容確認できる

npx prisma db pull

# 先に表示チェック
prisma db pull --print

クエリー

CRUD

@prisma/clientのインポートと、インスタンス生成は共通

user部分がテーブル名

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient()

// クエリー
const users = await prisma.user.findMany()

create

1行追加

const user = await prisma.user.create({
  data: {
    email: 'elsa@prisma.io',
    name: 'Elsa Prisma',
  },
})

複数行追加。dataの引数は配列

const createMany = await prisma.user.createMany({
  data: [
    { name: 'Bob', email: 'bob@prisma.io' },
    { name: 'Bobo', email: 'bob@prisma.io' }, // Duplicate unique key!
    { name: 'Yewande', email: 'yewande@prisma.io' },
    { name: 'Angelique', email: 'angelique@prisma.io' },
  ],
  skipDuplicates: true, // Skip 'Bobo'  
})

read

IDで取得

const user = await prisma.user.findUnique({
  where: {
    id: 99,
  },
})

全ユーザー取得

const users = await prisma.user.findMany()

whereで絞り込み。Filtering and sorting

const users = await prisma.user.findMany({
  where: {
    email: {
      endsWith: "prisma.io"
    }
  },
}

update

1行更新

const updateUser = await prisma.user.update({
  where: {
    email: 'viola@prisma.io',
  },
  data: {
    name: 'Viola the Magnificent',
  },
})

複数行更新

const updateUsers = await prisma.user.updateMany({
  where: {
    email: {
      contains: 'prisma.io',
    },
  },
  data: {
    role: 'ADMIN',
  },
})

upsert

const upsertUser = await prisma.user.upsert({
  where: {
    email: 'viola@prisma.io',
  },
  update: {
    name: 'Viola the Magnificent',
  },
  create: {
    email: 'viola@prisma.io',
    name: 'Viola the Magnificent',
  },
})

delete

1行削除

const deleteUser = await prisma.user.delete({
  where: {
    email: 'bert@prisma.io',
  },
})

複数行

const deleteUsers = await prisma.user.deleteMany({
  where: {
    email: {
      contains: 'prisma.io',
    },
  },
})

基本的なことやってみたけど、簡単で直感的なので迷うことは少なそう。