TypeScriptのORM 「Prisma」が素晴らしかった件

# 概要

`TypeORM`を普段使っていたが`Prisma`を使ってみると素晴らしかった(TypeORMがイケていない訳ではない）のでまとめる

> Prismaは、PostgreSQL、MySQL、SQL Server、SQLite、MongoDB、CockroachDB（プレビュー）用のオープンソースデータベースツールキットにより、アプリケーション開発者がより速く構築し、エラーを少なくすることを支援します。

https://www.prisma.io/:embed:cite

# やり方

## 依存関係をインストール

```bash
# package.jsonを生成する
npm init -y

# --save-dev プログラムの実行ではなくビルドや開発時に実行する
npm install prisma typescript ts-node @types/node --save-dev

# tsconfig.jsonの生成
npx tsc --init
```

## TypeScriptのコンパイラ設定



https://qiita.com/ryokkkke/items/390647a7c26933940470:embed:cite

- `experimentalDecorators`:デコレータの実験的なサポートを有効
- `target`:JSの出力バージョン
- `lib`:コンパイルする際に使用する組み込みライブラリ
- `module`:出力するjsのモジュールの仕組みとして何を使用するか
- `rootDir`:コンパイル結果をoutDirで出力する際に、どのディレクトリ配下のディレクトリ構造で出力するか
- `resolveJsonModule`:jsonファイルから型解決した状態で値を取得できるようにする
- `outDir`:コンパイルされたjsの出力先
- `esModuleInterop`:コンパイル時にヘルパーメソッドが生成される
- `forceConsistentCasingInFileNames`:import時にファイルパスの文字列で大文字小文字を区別するか
- `strict`:`strict`系のオプションを全て有効にするおまじない
- `noImplicitReturns`:条件分岐の条件によって明示的なreturnがされないルートがある場合、コンパイルエラーにしない
- `skipLibCheck`:`*.d.ts` ファイルに対する型チェックをスキップ
- `noPropertyAccessFromIndexSignature`:定義されているプロパティにアクセスする時はドットアクセスのみが許容
- `noImplicitOverride`:override修飾子なしのオーバーライドは認めない



```json:tsconfig.json
{
  "compilerOptions": {
    "experimentalDecorators": true,
    "target": "esnext",
    "lib": [
      "es6",
      "dom",
      "esnext"
    ],
    "module": "commonjs",
    "rootDir": "src",
    "resolveJsonModule": true,
    "outDir": "dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "noImplicitReturns": false,
    "skipLibCheck": true,
    "noPropertyAccessFromIndexSignature": true,
    "noImplicitOverride": true
  }
}
```

## 環境変数を定義する

```.env
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB (Preview).
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DEV_DATABASE_URL="mysql://ユーザー名:パスワード@localhost:8000/DBName?schema=public"
```

## prismaプロジェクトをセットアップ

https://www.prisma.io/docs/reference/api-reference/command-reference:embed:cite


```bash
# セットアップ
npx prisma init

# TypeScriptのコードを生成
prisma generate

# 既存のDBからモデルを生成する
prisma db pull

# スキーマファイルをフォーマット
npx prisma format

# ビジュアルエディタで確認
npx prisma studio
```

## スキーマのパスを定義


https://www.prisma.io/docs/concepts/components/prisma-schema:embed:cite



```json:package.json
"prisma": {
    "schema": "./prisma/schemaDev.prisma"
  }
```

## Prismaの構成ファイルを定義する

既存のDBからモデルを自動生成すると自動的に作成してくれます


```prisma:prisma/schemaDev.prisma
generator client {
  provider        = "prisma-client-js"
  output          = "./prisma/client"
  previewFeatures = ["fullTextSearch", "fullTextIndex"]
}

datasource db {
  provider = "mysql"
  url      = env("DEV_DATABASE_URL")
}

model admin_account {
  id             BigInt    @id @default(autoincrement())
  login_id       String?   @db.VarChar(255)
  login_password String?   @db.Text
  name           String?   @db.VarChar(255)
  name_kana      String?   @db.VarChar(255)
  role           Int       @default(0)
  status         Int?
  create_user    String?   @db.VarChar(255)
  update_user    String?   @db.VarChar(255)
  created_at     DateTime? @db.Timestamp(0)
  updated_at     DateTime? @db.Timestamp(0)
}
```