1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VSCode で schema.prisma ファイルを書く

Posted at

VSCode で schema.prisma ファイルを書く時までの手順と役に立ったツールをご紹介します。
筆者は Prisma を使い始めたばかりの初心者ですので、ご了承ください。

本記事のスコープ

schema.prisma ファイルを記述して、DB にテーブルを作成するまでを対象とします。
アプリケーションの実装は対象外です。

前提

今回は以下の環境で Prisma を使用することを前提とします。

項目
言語 TypeScript
フレームワーク NestJS
DBMS PostgreSQL
IDE VSCode
パッケージ管理ツール npm

Prisma とは

prisma は Node.js で使用されるオープンソースの ORM です。

手順

初期設定から DB にテーブルを作成するまでの手順を説明します。
NestJS のドキュメントにある手順を基本としています。

下記の手順で作成したプロジェクトのリポジトリはこちらからご確認ください。

初期設定

NestJS の CLI をインストールして、プロジェクトを作成します。

npm install -g @nestjs/cli
nest new prisma-training

作成したプロジェクトのディレクトリで、Prisma をインストールします。

cd prisma-training
npm install -D prisma

Prisma CLI コマンドで Prisma を初期化します。

npx prisma init

上記コマンドを実行すると、prisma/schema.prisma ファイルと .env ファイルが作成されます。

DB の準備

次に DB を準備します。
今回は docker-compose でローカルに PostgreSQL のコンテナを作成します。

以下のように docker-compose.yml ファイルを作成します。

docker-compose.yml
version: '3.9'

services:
  postgresql:
    image: postgres:latest
    container_name: postgresql
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - './data/psql:/data'

docker-compose.yml ファイルがあるディレクトリで下記コマンドを実行してコンテナを起動します。

docker-compose up

schema.prisma ファイルを書く

続いて、schema.prisma ファイルに DB 接続設定とモデル定義を書いていきます。

DB 接続設定

今回は PostgreSQL を使用するので以下のように記述します。

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

モデル定義

ここで、2 つのツールを使用します。

まずは VSCode の Prisma の拡張機能です。

私は schema.prisma ファイルのフォーマットのためにこの機能を使っていますが、他にも機能があるようです。

ファイル保存時に自動的にフォーマットさせるために、settings.json ファイルに以下を追記します。(*.prisma ファイルのみフォーマットに Prisma の拡張機能を使うという設定です)

settings.json
"[prisma]": {
  "editor.defaultFormatter": "Prisma.prisma"
},

次にご紹介するのが、prisma-case-format というツールです。
モデル定義は以下のように記述します。

schema.prisma
model users {
  id        Int      @id @default(autoincrement())
  name      String
  created_at DateTime @default(now())
  updated_at DateTime @updatedAt
}

Prisma CLI コマンドを実行することで、DB のテーブルと TypeScript の型が作成されるのですが、ここで 1 つ問題があります。

DB のテーブル名は、スネークケースで書くことが多いのに対して、TypeScript では変数名をキャメルケース、型名をパスカルケースで書くことが多いです。(参照

上記のモデル定義だとスネークケースで TypeScript の型が作成されてしまいます。

ここで役に立つのが prisma-case-format です。まず、prisma-case-format をインストールします。

npm install -D prisma-case-format

次に以下のコマンドを実行します。

npx prisma-case-format --file prisma/schema.prisma

すると、モデル定義が以下のように自動変換されます。

schema.prisma
model Users {
  id        Int      @id @default(autoincrement())
  name      String
  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")

  @@map("users")
}

@map は DB のテーブルで別名を定義できるデコレーションです。これによって DB ではスネークケース、TypeScript ではキャメルケースにできます。

これで schema.prisma ファイルを作成できました。

DB に反映させる

最後に DB への反映です。

起動したコンテナと接続するための URL を .env ファイルに記述します。

.env
DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"

以下のコマンドを実行して DB のテーブルと TypeScript の型を作成します。

npx prisma migrate dev --name init

以上で本記事の対象としている手順は終了です。TypeScript のアプリケーションの実装については他のドキュメントを参照してください。

参考

余談

テーブル名は複数形、TypeScript の型名は単数形にすることがありますが、prisma-case-format のオプションを使うことでそれにも対応できるようです。
このような便利なツールを作ってくれる人には頭が上がりません。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?