✍️

Prisma 入門してみた

2022/10/07に公開約3,600字

モチベーション

  • Prismaの概要を知る
  • 環境構築する
  • Prisma schemeについて
  • Prisma Migrateについて
  • Prisma Clientについて
  • Prisma Studioについて

Prismaの概要を知る

  • https://www.prisma.io/
  • Node.js, TypeScriptで利用できるORM
  • スキーマを元に、マイグレーションできる為便利
  • JSとORMの相性が良いので、かなりライトにDBと仲良く出来る

環境構築する

package.json 準備

npm init -y

ts環境

npm install typescript ts-node @type/node -D

tsconfig.json作成

touch tsconfig.json

tsconfig.json編集

{
  "compilerOptions": {
    "sourceMap": true,
    "outDir": "dist",
    "strict": true,
    "lib": ["esnext"],
    "esModuleInterop": true
  }
}

Prismaインストール

npm i prisma -D

DBにSQLiteを指定(デフォルトはPostgreSQL)

npx prisma init --datasource-provider sqlite

prisma/scheme.prisma と .env が作成される

Prisma scheme

.env

DBのパス指定が記述されているファイルが作成される

DATABASE_URL="file:./dev.db"

scheme.prisma

↓初期はこれだけ(DBの指定、clientの指定)

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

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

↓このファイルにスキーマも書いていく

model User {
  id Int @id @default(autoincrement())
  email String @unique
  name String?
  posts Post[]
}

model Post {
  id Int @id @default(autoincrement())
  title String
  content String?
  published Boolean @default(false)
  author User @relation(fields: [authorId], references: [id])
  authorId Int
}

Prisma Migrateについて

scheme.prismaを元にテーブルを作成する為、下記コマンドを実行

npx prisma migrate dev --name init

prisma/以下にmigrations/が作成され、
日時_--nameで指定した文字列 のディレクトリとmigration.sqlも併せて作成される

migration.sqlの内容は以下
スキーマで記述したとおりに、SQL文が発行される

-- CreateTable
CREATE TABLE "User" (
    "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "email" TEXT NOT NULL,
    "name" TEXT
);

-- CreateTable
CREATE TABLE "Post" (
    "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "title" TEXT NOT NULL,
    "content" TEXT,
    "published" BOOLEAN NOT NULL DEFAULT false,
    "authorId" INTEGER NOT NULL,
    CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
);

-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");

scheme.prismaを編集し、再度 prisma migrateを実行した場合

npx prisma migrate dev --name add_job_title

↓同じ様にmigration.sqlが作成される

中身は、ALTER TABLEのみといった感じ

-- AlterTable
ALTER TABLE "User" ADD COLUMN "jobTitle" TEXT;

Prisma Clientについて

↓こんな感じでバックエンドのコードがTS(JS)で記述可能です。

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const create_user = await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@prisma.io',
    },
  })
  console.log(create_user)

  const find_user = await prisma.user.findMany()
  console.log(find_user)
}

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

  1. PrismaClientのインスタンスを作成
const prisma = new PrismaClient()
  1. スキーマに書いたモデルに対して、 .createでInsertが可能です。
prisma.user.create({
  data: {
    name: 'Alice',
    email: 'alice@prisma.io',
  },
})

3. findMany()などのメソッドでSelect文的なことができます。

const find_user = await prisma.user.findMany()

他にもfindUniqueを利用することで、where句の様な挙動を利用できたりします。

Prisma Studio

Prismaのデータは、下記のコマンドでGUIベースで確認可能です。

npx prisma studio

Discussion

ログインするとコメントできます