m_shige1979のささやかな抵抗と欲望の日々

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

PrismaでSeedでデータを投入する

前回

m-shige1979.hatenablog.com

Prisma

www.prisma.io

今回

Seedでデータを投入する

やり方

なんかprisma/seed.tsを作成して、データを登録する処理を書くみたい

やってみる

プロジェクト構成は前回のまま

package.json

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@prisma/client": "^3.5.0",
    "@types/express": "^4.17.13",
    "@types/node": "^16.11.9",
    "express": "^4.17.1",
    "ts-node": "^10.4.0",
    "typescript": "^4.5.2"
  },
  "devDependencies": {
    "prisma": "^3.5.0"
  }
}

スクリプト作成

参考になりそうなもの

github.com

prisma/seed.ts

import { PrismaClient, Prisma } from '@prisma/client'
const prisma = new PrismaClient()

// モデル投入用のデータ定義
const userData: Prisma.UserCreateInput[] = [
    {
        name: 'hoge1',
        email: 'hoge1@example.com',
    },
    {
        name: 'hoge2',
        email: 'hoge2@example.com',
    },
    {
        name: 'hoge3',
        email: 'hoge3@example.com',
    },
]

const transfer = async () => {
    const users = [];
    for (const u of userData) {
        const user = prisma.user.create({
            data: u,
        })
        users.push(user);
    }
    return await prisma.$transaction(users);
}

// 定義されたデータを実際のモデルへ登録する処理
const main = async () => {
    console.log(`Start seeding ...`)

    await transfer();

    console.log(`Seeding finished.`)
}

// 処理開始
main()
    .catch((e) => {
        console.error(e)
        process.exit(1)
    })
    .finally(async () => {
        await prisma.$disconnect()
    })

seedコマンドを追加

package.json

以下を追加

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

実行

app# npx prisma db seed
Environment variables loaded from .env
Running seed command `ts-node prisma/seed.ts` ...
Start seeding ...
Seeding finished.

🌱  The seed command has been executed.
app#

f:id:m_shige1979:20211120212558p:plain

OK

所感

seed.tsに共通処理を記載して、あとはデータやテーブルは別ファイルで管理すればそこまで肥大化しないのでは と思っている。 次はそうだな…expressと連携してAPI経由でデータを取得するところをやってみよう。

github

github.com