GraphQLNexusPostgreSQLPrismaReact Native npx prisma db seednpx prisma studioPrisma Studio

Prisma でデータを PostgreSQL に一括入力する方法

apollo-server-nexus-02 GraphQL
スポンサーリンク

関連記事は⬇︎⬇︎

利用シーン

🎯 アプリケーションの起動に必要なデータ ( デフォルトの言語やデフォルトのジャンルなど ) をデータベースに一括入力できます。
🎯 開発環境でアプリケーションを検証して使用するための基本データを一括入力できます。

これは、開発データベースのリセットが必要になる場合がある Prisma Migrate を使用している場合に特に便利です。

prisma.seed キーを追加する

Prisma の統合シード機能は、package.json ファイルの prisma.seed キーに実行するコマンドを設定しておいて、prisma db seed がそれを実行します。

Line 7-9 を追加します。

// package.json

{
  "name": "backend",
  "version": "1.0.0",
  "main": "index.js",
  "prisma": {
    "seed": "ts-node prisma/seed.ts"
  },
...

プロジェクトの prisma フォルダー内にシード スクリプト( seed.ts ) を記述します。

仮に以下のように Daibunrui、Chubunrui テーブルがあるとします。

大分類データを先に入力し、各大分類別 中分類でーたを入力することを想定します。

// 大分類
model Daibunrui {
  id     Int     @id @default(autoincrement())
  name  String  @unique
  daibunruis Chubunrui[]
}

// 中分類
model Chubunrui {
  id      Int    @id @default(autoincrement())
  name   String @unique
  daibunrui   Daibunrui? @relation(fields: [daibunruiId], references: [id])
  daibunruiId Int?
}

prisma/seed-sources.ts に入力データを作成します。(任意)

// prisma/seed-sources.ts

export const daibunrui = [
  { name: "HOGE" },
  { name: "FOO" },
  { name: "BAR" },
  { name: "BAZ" },
  ...
];

const hogeId = 1;
const fooId = 2;
const barId = 3;
const bazId = 4;
export const chubunrui = [
  { name: "hoge1", daibunruiId: hogeId },
  { name: "hoge2", daibunruiId: hogeId },
  ...
  { name: "foo1", daibunruiId: fooId },
  { name: "foo2", daibunruiId: fooId },
  ...
  { name: "bar1", daibunruiId: barId },
  { name: "bar2", daibunruiId: barId },
  ...
  { name: "baz1", daibunruiId: bazId },
  { name: "baz2", daibunruiId: bazId },
  ...
];

createMany() で一括入力できます。( SQLite はサポートしません )

skipDuplicates: true で重複データを排除します。

// prisma/seed.ts

import { PrismaClient } from "@prisma/client";
import { daibunrui, chubunrui } from "./seed-sources";

const prisma = new PrismaClient();

async function main() {
  try {
    await prisma.daibunrui.createMany({ data: [...daibunrui], skipDuplicates: true });
  } catch (error) {
    console.error(error);
  } finally {
    await prisma.chubunrui.createMany({ data: [...chubunrui], skipDuplicates: true });
  }
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });

実行する

try🐶everything backend$ npx prisma db seed
Environment variables loaded from .env
Running seed command `ts-node prisma/seed.ts` ...

🌱  The seed command has been executed.
try🐶everything backend$ 

確認する

npx prisma studio コマンドで Prisma Studio を実行して確認します。

デフォルトで 5555 ポートを使用しますが、Android エミュレーターも同じポートを利用するので変更しておくと良いと思います。

$ npx prisma studio -p 5505

スポンサーリンク

参考文献

Seeding your database

コメント

タイトルとURLをコピーしました