🌱

Drizzleで初期データ (seed) をDBに投入する方法

2024/05/12に公開

こんにちは、合同会社Stegのkeigoです。今回は、Drrizleで初期データをDB投入するための手法を紹介します。

Drizzleは現時点で、初期データ投入に特化した機能は提供していません。実現させるためには、DBとの接続処理や実行スクリプト、insert処理等を自分で実装する必要があります。
今回のプロジェクトでは、プロジェクトのルートディレクトリにdbフォルダを作成し、この中にDBのスキーマ情報や各種スクリプトを配置しています。

今回は例として、PostgreSQLのusersテーブルに簡単な初期データを保存する処理を紹介します。

初期データ投入対象のテーブル構造

usersテーブルは、以下の構成とします。

  • id: serial (primarykey)
  • name: varchar (length: 256)
  • email: varchar (length: 256)

スキーマファイル

前項で紹介したusersテーブルの構造から、以下のスキーマファイルを作成します。

// db/schema.ts
import { pgTable, serial, varchar } from "drizzle-orm/pg-core";
 
export const users = pgTable("users", {
  id: serial("id").primaryKey(),
  name: varchar("name", { length: 256 })
  email: varchar("email", { length: 256 }),
});

実行コマンドの登録

今回は、 npm run drizzle:seed で初期データ投入を実行できるようにします。
package.jsonに以下のようなscriptを登録してください。

{
  "scripts": {
+   "drizzle:seed": "tsx ./src/db/seed.ts"
  }
}

初期データ投入スクリプトコード

以下のスクリプトを書くことで、insert関数内に記述したデータをDBに保存することができます。

// db/seed.ts
import { db, client } from '~/db/index';
import { users } from '~/db/schema';

await db.insert(users).values({
  username: 'Yamada Taro',
  email: 'taro@example.com'
})

await client.end();

上記コードでは、db/indexから dbclientをimportしています。これは、以下の公式ドキュメントのindex.tsをベースに、clientdbをそれぞれexportしていることを想定して記述しています。
https://orm.drizzle.team/docs/get-started-postgresql#node-postgres

// db/index.ts
import { pgTable, serial, text, varchar } from "drizzle-orm/pg-core";
import { drizzle } from "drizzle-orm/node-postgres";
import { Client } from "pg";

export const client = new Client({
  connectionString: "postgres://user:password@host:port/db",
});
export const client = await client.connect();
export const db = drizzle(client);

おわりに

以下のコマンドを実行して、初期データ投入スクリプトを実行します。

npm run db:seed

正常に実行が完了したら、以下のコマンドでDBの中身を確認してみましょう。

npx drizzle-kit studio

新たなレコードが作成されていたら完了です。

Steg Inc.

Discussion