🌱
Drizzleで初期データ (seed) をDBに投入する方法
こんにちは、合同会社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
から db
とclient
をimportしています。これは、以下の公式ドキュメントのindex.ts
をベースに、client
とdb
をそれぞれexportしていることを想定して記述しています。
// 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
新たなレコードが作成されていたら完了です。
Discussion