Prisma+fakerでサクッとデモデータを作る

# Prisma+fakerでサクッとデモデータを作る

[MYJLab Advent Calendar 2022](https://qiita.com/advent-calendar/2022/myjlab)、14日目の記事、担当は3年の@takumiakasaka1231です！

昨日の記事は、@mahirooooonの`Word2Vec`についてでした。

言葉の足し算引き算が楽しいらしく、授業後に目をキラキラさせながらお話していたのを思い出しました。（笑）

さて、本日は、モダンなORMであるprismaとfakerを使って、サクッとデモデータをDB内に入れていってみようと思います！

では、僕の初qiita記事、スタートです！

## 公式ducument

https://www.prisma.io/docs

https://fakerjs.dev/guide/

## 背景

backend開発の時、DBにデモデータをいれるのが面倒くさいときってありますよね？

そんなときに劇的に開発効率を上げてくれる方法があります。

(seedで、チーム全員でデモデータをそろえたいときは、この手法は向いていません)

## 環境構築(prisma,faker,mysql)

prismaのinstall(node 14.17.0以上が必要らしいです)(そこでめっちゃ怒られた)

```terminal
npm init -y 
npm install typescript ts-node @types/node --save-dev
```

```terminal
npx tsc --init
```

```terminal
npm install prisma --save-dev
```

```terminal
npx prisma init --datasource-provider sqlite
```

fakerのinstall

```terminal
npm install @faker-js/faker --save-dev
```

localでmysqlを立ち上げてください

```terminal
docker pull mysql
```

```terminal
docker run --name your-container-name -e MYSQL_ROOT_PASSWORD=your-password -d -p 3306:3306 mysql:tag
```

これで環境が整いました。

## ファイルの中身

これらのコマンドを実行した後、ファイルがいろいろできたと思います。
今回は、関連する部分だけ

- prisma/schema.prisma

DBの中身を実際に書いていく部分になります。

早速、中身を変更していきましょう。

## schemaの変更

schema.prismaをこんな感じに変更してみましょう

```ts
// 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 = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String?
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
}
```

.envに`DATABASE_URL`の追加をお忘れなく

そしたら、`migrate`をしていきます

```terminal
npx prisma migrate dev --name init
```

次は、実際にデータを入れるseed.tsを用意していきましょう！

## seed.ts

まずは、`package.json`に以下を追加します。

```json
"prisma": {
    "seed": "ts-node prisma/seed.ts"
  }
```

これで、seed.tsを実行する準備が完了しました。
次に、実際のファイルを作成、編集していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701688/04e87f4a-2fe7-c465-7eb4-92524cfdc7d4.png)

`prisma`フォルダー下に`seed.ts`を作成します

seed.tsを以下のように記述します。

```ts
import { PrismaClient } from "@prisma/client";
import { faker } from "@faker-js/faker";

const prisma = new PrismaClient();
async function main() {
  for (let index = 0; index < 100; index++) {
    await prisma.user.create({
      data: {
        name: faker.name.fullName(),
        email: faker.internet.email(),
        posts: {
          createMany: {
            data: [
              {
                title: faker.name.jobTitle(),
              },
              {
                title: faker.name.jobTitle(),
              },
              {
                title: faker.name.jobTitle(),
              },
              {
                title: faker.name.jobTitle(),
              },
              {
                title: faker.name.jobTitle(),
              },
            ],
          },
        },
      },
    });
  }
}
main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });

```

その後、`seed.ts`を動かしていきます

```terminal
npx prisma migrate reset
```

```terminal
🌱  The seed command has been executed.
```

と表示されれば成功です！！

`prisma studio`を覗きに行きましょう

```terminal
npx prisma studio
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701688/770c4ad8-e55f-cfc9-20bd-a61baf31ef7c.png)

完璧です。

100人と、1人につき5つ投稿が紐づいたデモデータを作成することができました！！！

## 終わりに

どうでしたか？

初投稿の記事となりますが、皆さまの知識になったり、参考になれば幸いです。

これを機に、たくさん投稿したいです！

ではまたっ！！！

## 参考文献

prisma 公式ドキュメント

https://www.prisma.io/docs/

faker.js 公式ドキュメント

https://fakerjs.dev/guide/

Seeding Database with Prisma & Faker -by Leigh Halliday

https://www.youtube.com/watch?v=7RrgSh4k3nM