PrismaでDBの中に複数のテーブルを作成

# はじめに
こんにちは、Hideです。
久しぶりに投稿いたします。

今回はPrismaでDBの中に複数のテーブルを作成する方法を書いていきます。

## 書いていく内容
- [Prismaとは](#jump-prisma)
- [ORM(Object Relational Mapping)とは](#jump-orm)
- [Prismaをセットアップ](#jump-setup)
- [Prismaスキーマでデータをモデル化](#jump-model)
- [まとめ](#jump-finish)

## <a name="jump-prisma"></a>Prismaとは
Prismaはサーバからデータベースを操作する際に、
サーバとデータベースの間を仲介する役目を持っておりデータベースを操作する際は、
どの**データベースを利用しているか意識することなく共通のオブジェクトメソッドを、
利用する**ことができるオープンソースORMです。

### 特徴
- 型安全なデータベースアクセス
- TypeScriptとの相性が良い
- Node.jsを対象としたオープンソースORM

## <a name="jump-orm"></a>ORM(Object Relational Mapping)とは
RDB（Relational Database: 関係データベース）に対するデータの操作を、
オブジェクト指向型言語（Object-Oriented Programming Language）のやり方で、
扱えるようにするための手法です。

具体的には、RDBに対する操作がカプセルかされたORM用のライブラリを使用し、
これがSQLの生成などを背後で行ってくれます。
DBのテーブルはクラスと紐づけられ、
オブジェクトに対する操作をすることでデータの操作を行います。
これにより、**SQLを書く手間を省くことが可能**です。

### 特徴
- SQLを書かなくてよい
- オブジェクト指向型言語で書ける
- RDBへの処理がカプセル化されている

## <a name="jump-setup"></a>Prismaをセットアップ
### 前提条件
- Nodeがインストールされていること<br>※Node.js v14.17.0以降が必要です
- TypeScriptプロジェクトが作成されていること

それでは、セットアップをしていきます。
まずは、プロジェクトの開発依存関係としてPrisma CLIをインストールします。
```
npm install prisma --save-dev
```
次に、Prismaを init Prisma CLIのコマンドを実行する
```
npx prisma init --datasource-provider sqlite
```
これは新しい prisma Prismaスキーマファイルを使用してディレクトリを作成し、
SQLiteをデータベースとして構成します。
これで、データをモデル化し、データベースを作成する準備ができました。

## <a name="jump-model"></a>Prismaスキーマでデータをモデル化
Prismaスキーマは、データをモデル化する直感的な方法を提供します。
次のモデルを追加します。
➥ `schema.prisma` ファイル
```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 = "sqlite"
  url      = env("DATABASE_URL")
}

 model User {
    id        Int      @id @default(autoincrement())
    firstName String
    lastName  String
    email     String   @unique
    password  String
    todos     Todo[]
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt
 }

 model Todo {
    id        Int      @id @default(autoincrement())
    title     String
    data      String
    completed Boolean
    user      User     @relation(fields: [userId], references: [id])
    userId    Int
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt
 }
```
データモデルの定義は以下で構成されます。

- モデル (model  プリミティブ)は モデル間の関係
- エナム (enum プリミティブ) (コネクタがEnumsをサポートしている場合)
- 属性 そして 関数 フィールドとモデルの動作を変更します

対応するデータベースは次のようになります。
![イメージ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2652946/68d81ab7-fb4e-0a3a-863f-4c3a0214b4d9.png)

`.env`ファイルは次のように記載します
```.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.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DATABASE_URL="file:./dev.db"
```

最後にマイグレーションを行うため、以下のコマンド実行します
```
npx prisma migrate dev --name init
```
以上で、DBとテーブルを作成することができました。

# <a name="jump-finish"></a>まとめ
今回はテーブルを2つしか作成しておりませんが、
もっと複数のテーブルを作成し、複雑にすることも可能です。
余裕がございましたら、チャレンジをしてみてもよいかもしれません。

### 参考資料
[Data Model(Reference)](https://www.prisma.io/docs/concepts/components/prisma-schema/data-model)
[PrismaでのInner Joinのやりかた](https://zenn.dev/nitaking/articles/68159b441a65d2b3a07e)