ザッと読める基礎シリーズ【Prisma編】

投稿日:2023/03/18 最終更新日:2023/03/18

ザッと読める基礎シリーズ【Prisma編】

Prismaの概要

Node.js/TypeScript環境で利用できるオープンソースのORM(Object Relational Mapping)

SQL(select, insert, update, delete, etc.)の代わりにオブジェクトのメソッド(create, update, delete, etc.)を通してデータベースの操作を行うことができる

・データベース操作はPrisma Client
→ 通常データベースの操作にはSQLを記述して実行する必要があるが、PrismaではSQLではなくJavaScript/TypeScriptメソッドを利用してデータベースを操作する

・データベースへのテーブル作成はPrisma Migrate
→ Prismaの設定ファイル(schema.prisma)にデータモデルを記述しマイグレーションを行うことでデータベースにテーブルを作成することが可能
→ マイグレーションの履歴も保存可能/操作の取り消しや再実行も簡単にできる(SQLは不要)

・アプリケーション構築にはデータを保存する場合は必ずデータベースが必要
→ データベースの効率的な管理/簡単な操作で連携出来る=Prisma

・prismaはサーバーとデータベースを仲介するもの
→ 共通のオブジェクトメソッドを使用できる
→ TypeScriptを導入しているなら非常に便利になる

Prismaの導入

1. インストールする

npm install prisma --save-dev

2. セットアップする(設定ファイルを作成する)

npx prisma init

・prismaフォルダと.envファイルが作成される
→ Prismaフォルダ:設定用のschema.prismaファイルが作成される
→ .envファイル:データベースに接続するために必要な環境変数を設定

3. schema.prismaを確認する

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

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

・generatorはschema.prismaを元にデータベース操作に使用するPrisma Clientを作成するために利用
→ マイグレーションを実行することで毎回再作成される(更新される)

・datasourceはproviderにデータベースを設定することができる
→ postgresql(デフォルト), mysql, sqlite, sqlserverとPreviewとしてmongodbとcockroachdbがサポート

4. Modelを定義する

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

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

model User {
 id Int @id @default(autoincrement())
 title String @db.VarChar(100)
 date DateTime @default(now())

 @@map(name: "users")
}

・データベースにテーブルを作成するためデータモデル定義(Data model Definition)を記述する必要がある
→ デフォルトでは定義されていないので必須事項

・@idはidを生成したい場合に使用する
→ @defaultはデフォルト値を設定することが可能
→ autoincrement()を引数に設定することでデータ追加時ににidが自動で加算される仕組み

・@uniqueはemail列で一意の値のみ登録するようにする

・@db.VarCharは可変長文字列を指定をさせ、0~65535までのバイト数を指定する(文字数)

・@@map(name: “名前”)を指定することで独自のテーブル名のマイグレーションファイルを生成できる
→ @map(name: “名前”)は独自のカラム名を生成する際に使用

・日付データを使用する場合はDateTime型を指定する
→ デフォルトで現在の時間を保存する場合は@default(now())を指定する
→ @updatedAtは更新日付の登録の際に使用

5. フォーマットをかける

npx prisma format

・schema.prismaファイルにフォーマットをかけられるため見やすくなり便利

6. .envファイルを編集する

DATABASE_URL="postgresql://DBユーザー名:DBユーザーパスワード@localhost:5432/DB名?schema=public"

・DBユーザー名、DBユーザーパスワード、DB名を指定する

・PostgreSQLでDBを作成していない場合は以下の通り(ローカル)

// PostgreSQLにログインする
psql DBユーザー名

// \lで全DBを確認出来る
\l

// DBを作成する→ここでのDB名を.envにて設定する
CREATE DATABASE DB名;

// PostgreSQLからログアウト
\q

7. マイグレーションをする(初期作成時)

npx prisma migrate dev --name init

・scheme.prismaに作成したModelをデータベースとの接続で使用できるようにする

・「✔ Generated Prisma Client 〜〜 in 49ms」と表示されたらOK
→ 発行されたSQLがprisma/migrates内に格納されている(更新の際に書き変わっていく)

8. Prisma Clientを作成する

公式サイトを参照

・個人的に作成の際は/prisma/prisma.tsなどで作成することが多い

・Prisma Clientを作成してDBとのやり取りが出来るようにしていく

9. 初期データを作成する

import { prisma } from "./prisma";

const initData = async() => {
 await prisma.user.createMany({
  data: [
   { title: "Data1" },
   { title: "Data2" },
   { title: "Data3" }
  ]
 })
};

initData().catch(e => {
 console.error(e);
 process.exit(1);
}).finally(async () => {
 await prisma.$disconnect;
});

・個人的にファイル名は後々書き換える必要があるのでdata.tsなどで良いと思う

・process.exit(1)はNode APIの1つで異常終了の際に指定する
→ 通常はexit 出なくてもスクリプトが最後まで動けばプログラムは終了し終了ステータスが 0になる
→ 異常終了を明示的に指定したい場合は1以上の数値を指定すればOK

・prisma.$disconnectは明示的に呼び出す必要はないらしい(公式いわく)
→ スクリプトが完了すれば自動的に閉じるため
→ ただ、テスト時などの際は明示的に切断するアクションとして呼び足すのもあり

10. 必要なパッケージをインストール

npm install --save-dev ts-node @types/node

11. package,jsonにPrismaのコマンドを追記

 {
  ...
  "private": true,
  "prisma": {
    "data": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/data.ts"
  },
  ...
}

・ts-nodeコマンドはTypescriptのファイルをNode.jsで使用するために使う

・–compiler-optionsは実行時に{\”module\”:\”CommonJS\”}を読み込ませるオプションコマンド

・最後に実行するファイルを指定

12. 初期データの登録

npx prisma db data

・dataの箇所はprismaコマンドのキーを指定する
→ キーがaaaであれば、npx prisma db aaa となる

13. Prisma Studioで確認する

npx prisma studio

・Prisma Studioが自動的に起動してDBのデータを確認することができる
→ 先ほど登録した初期データが入っていればOK

参考資料

https://reffect.co.jp/node-js/prisma-basic

https://zenn.dev/ikekyo/scraps/f6c87fbfd3bf9d

https://wp-kyoto.net/prisma-handle-date-data/

https://qiita.com/hiroyuki_mrp/items/10322eeb29bb8e35987f

http://yohshiy.blog.fc2.com/blog-entry-314.html