未来の自分のために簡単にprismaについて調べておこう、、

# Prismaとは
PrismaはNode.jsを対象としたオープンソースORMのこと。
型安全なデータベースアクセスが特徴で、TypeScriptとの相性が良い。
RailsでいうActiveRecord。

## Prismaを構成する5要素
### Prisma Model
アプリケーションで使用するモデルを表現するもの。
モデル内でテーブルやカラムの定義を行うことが可能。
Prisma Clientでクエリーを発行するために必要となる。

### Prisma schema
Prismaの設定ファイル。
データベースクライアントやマイグレーションファイルの生成を行う。

### Prisma Client
Node.js および TypeScript用の自動生成された型安全なクエリビルダーのこと。
Prisma Modelでの型情報を使用して、クエリーの結果は型安全となる。

### Prisma Migrate
宣言型データモデリングおよび移行システムで、Prisma Schemaの情報をベースにマイグレーション周りの処理が可能になる。

### Prisma Studio
データベース上のデータを閲覧・編集することができるGUIのこと。

# 利用までの手順
1. 以下のコマンドでPrismaのインストールを行う。
    ```bash
    // yarnの場合
    yarn add -D prisma

    // npmの場合
    npm install prisma
    ```
2. Prismaを初期化する
    - 「prismaフォルダ」と「.envファイル」が作成される。

    ```bash
    npx prisma init
    ```

3. schema.prismaの設定
    ```typescript
    // prisma generateコマンドの対象
    generator client {
      provider = “prisma-client-js”
    }

    // 使用データベースの情報
    datasource db {
      provider = “mysql”
      url      = env(“DATABASE_URL”)
    }

    // モデル（テーブル）情報
    model User {
      id Int @id @default(autoincrement())
      name String
      email String
      created_at DateTime @default(now())
      updated_at DateTime @default(now())
    }
    ```
4. envファイルのデータベース情報を書き換える。
    ```.env
    // DATABASE_URL="使用DB://ユーザー名:パスワード@URL/DB名?schema=public"
    DATABASE_URL="mysql://postgresql:password@localhost:5432/test_db?schema=public"
    ```
5. 以下のコマンドを実行してマイグレーションを行う。
    ```bash
    npx prisma migrate dev --name init
    ```
6. prisma studioでテーブルが作成されているか確認する。
    - [http://localhost:5555](http://localhost:5555)で確認可能。

    ```bash
    npx prisma studio
    ```

# よく使うprismaメソッド
## レコード作成

```typescript
// prisma.テーブル名.createでレコードを作成可能
await prisma.users.create({
    data: {
        name: name,
        email: email,
    },
});
```

## レコード全件取得

```typescript
// テーブルのレコードを全件取得
await prisma.users.findMany();

// 特定の条件に該当するレコードを全件取得
await prisma.user.findMany({
  where: {
    email: email,
  },
})
```

## レコード個別取得

```typescript
// ユニークなレコードを取得
await prisma.users.findUnique({
    where: {
        id: Number(req.params.id),
    },
});

// 最初に一致したレコードを取得
await prisma.users.findFirst({
    where: {
        name: name,
    },
});
```

## レコード更新

```typescript
await prisma.users.update({
    where: {
        id: Number(req.params.id),
    },
    data: {
        name: updatedName,
        email: updatedEmail,
    },
});
```

## レコード削除

```typescript
await prisma.users.delete({
    where: {
        id: Number(req.params.id),
    },
});
```

# よく使うprismaコマンド
## ローカルでschemaをDBへ反映させる

```bash
npx prisma migrate dev
```

## seed実行

```bash
npx prisma db seed
```

## GUI上でデータ確認

```bash
npx prisma studio
```

## schemaでのerrorを確認

```bash
npx prisma validate
```

# 参考
[Prisma Document](https://www.prisma.io/docs)

[Prismaの導入とメリットを考える](https://qiita.com/am_765/items/5e42bd5f87b296f61fbc)

[【入門】Prismaを初めて使うときに知りたいことまとめ](https://rakuraku-engineer.com/posts/prisma-introduction/)

[次世代の Node.js ORM 、Prisma をサクッと入門する](https://zenn.dev/pyhrinezumi/articles/431be604f9ad50)

[Prisma 基礎](https://zenn.dev/smish0000/articles/f1a6f463417b65)

[prisma チートシート（CLI）](https://qiita.com/ryskBonn92/items/c45e22ce5f37d82ec8de)

[Prismaコマンドまとめ](https://zenn.dev/plaincode/articles/f9e96577ec7331)

[PrismaでSQLの作成や管理、反映の手間を削減する](https://qiita.com/teradatk/items/8efcaf9e8ba0ee8bc6da)

[Prisma頻出コマンドとマイグレーションの運用](https://tech-blog.s-yoshiki.com/entry/315)