😼

Chapter2: NestJSを使ってみた Prismaをインストール/設定を行う

2022/03/08に公開

Prev Chapter

これはなに

NestJSプロジェクトにPrismaを導入します。
このChapterでは、Prismaの機能を利用してテーブルを定義し、ブラウザUIを利用してレコードが追加するまでを行ないます。

この記事ではMySQLを利用していますが、DBの準備については記載していません。
以下のコミットでMySQLコンテナを用意してるので参考にしてもらえるといいのかも!
https://github.com/rinonkia/nest-tutorial/commit/f1d97e78b3647363ef79a1700894db999b514532

Prismaとは

Prisma概要

https://www.prisma.io/

PrismaはNode.js-TypeSciptプロジェクトのために用意されたORMです。とても厳格で制約が強く型安全で、かつ直感的なインターフェースでデータベースにアクセスすることが出来ます。その他にも開発効率の向上が期待できる便利な機能があります。

Prismaの具体的な機能

Prismaの機能は以下の3つで構成されています。

機能 説明
Prisma Client コード記述が少なく、型安全によるミスを防ぐORM(次回Chapterで利用します)
Prisma Migrate カスタマイズ自在で手間のかからないマイグレーション
Prisma Studio データ検索や操作が手軽にブラウザで行えるUI

Prismaを紹介した日本語訳記事もあるのでご参考に
https://zenn.dev/kanasugi/articles/a082bd39c5bdf2

それでは早速導入してみます。

Prismaインストール/設定

Prismaインストール

$ npm install prisma --save-dev

Prisma初期化と設定変更

正常にインストールが完了したらnpxを使ってPrismaの初期化を行ないます。
以下のコマンドを実行すると./.env, ./prisma/schema.prismaファイルが作成されます。

$ npx prisma init

✔ Your Prisma schema was created at prisma/schema.prisma
  You can now open it in your favorite editor.

warn You already have a .gitignore. Don't forget to exclude .env to not commit any secret.

Next steps:
1. Set the DATABASE_URL in the .env file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started
2. Set the provider of the datasource block in schema.prisma to match your database: postgresql, mysql, sqlite, sqlserver or mongodb (Preview).
3. Run prisma db pull to turn your database schema into a Prisma schema.
4. Run prisma generate to generate the Prisma Client. You can then start querying your database.**

.envファイルが生成されます。
.gitignoreにない場合は追加してください。

schema.prisma

このファイルは利用するDatasourceの設定やテーブル定義で利用します。
本稿ではMySQLを利用するのでdatasourceのproviderをmysqlに変更します。

./schema.prisma
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

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

.env

DBとの接続先の設定指定ファイルです。
こちらもMySQLを使うので、下記のように用意したdatabase URLに変更します。

./.env
DATABASE_URL="mysql://USER:PASSWORD@HOST:PORT/DATABASE"

Prismaモデルの定義

設定が完了したところでテーブルを定義していきましょう。
テーブルは./prisma/schema.prismaで定義します。

今回テーブル名、カラム名はスネークケースを利用しています。
Prisma公式ドキュメントではアッパーキャメルケースを利用しているので、そちらの方がいい方は適宜書き替えてください。アッパーキャメルケースの場合、以下のコードの@@map("user")は不要になります。

./shema.prisma
model User {
  id         Int      @id @default(autoincrement())
  email      String   @unique
  name       String   @db.VarChar(10)
  created_at DateTime @default(dbgenerated("NOW()")) @db.Timestamp(0)
  updated_at DateTime @default(dbgenerated("NOW() ON UPDATE CURRENT_TIMESTAMP")) @db.Timestamp(0)

  @@map("user") # これがない場合、テーブル名がモデルと同じ文字列になる
}

Prisma Migration

Prismaモデルが用意できたら、マイグレーションを行ないます。
以下のコマンドを実行すれば、簡単にDBのマイグレーションが実行できます。
用意したDBが起動中であることを確認して、以下を行ってください。

$ npx prisma migrate dev --name init

このコマンドは、以下のことが行われています。

  • ./prisma/配下にmigrationsディレクトリが作成され、SQLが生成
  • 接続しているDBにテーブルを生成
prisma以下のファイル
prisma
├── migrations
│   ├── 20220308080922_init
│   │   └── migration.sql
│   └── migration_lock.toml
└── schema.prisma

DBにアクセスしてテーブルが生成されているか確認しましょう。
無事成功していたら、Prismaモデルで定義した以下のようなuserテーブルが生成されています。

mysql> desc user;
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
| Field      | Type         | Null | Key | Default           | Extra                                         |
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment                                |
| email      | varchar(191) | NO   | UNI | NULL              |                                               |
| name       | varchar(10)  | NO   |     | NULL              |                                               |
| created_at | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED                             |
| updated_at | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
5 rows in set (0.02 sec)

Prisma Studio

無事にマイグレーションが行われたので、今度はPrisma Studioを利用してDBを確認しましょう。
以下のコマンドを叩くことで、簡単にPrisma Studioを立ち上げることが出来ます。

このコマンドを実行する前にDBが起動中であることを確認してください。

npx prisma studio

このコマンドを実行すると自動的にブラウザで http://localhost:5555が開きPrismaモデル選択画面が開きます。
Userを選択すればテーブルのレコードが確認できます。

試しにAdd recordボタンを押して、レコードを追加してみましょう。

Save changeボタンを押せば、レコードが保存されます。
MySQLのコンテナで確認したところ、無事レコードが確認できました。

これでPrismaの設定は完了となります。

おわり

今回修正した内容
https://github.com/rinonkia/nest-tutorial/commit/9bd7afe5403e02b149a52d998cefd4f2c0f56945

次は実際にNestJSのプロジェクトでPrisma Clientを利用しコードを書いていきます。

作成中

Discussion