📑
node-pg-migrateでマイグレーションをする
はじめに
DBを使うプロジェクトにはマイグレーションツールが欠かせません。
開発でTypeScriptを使うので、
マイグレーションツールもnode.jsで動くものを探したところ、node-pg-migrate
が良さそうだと感じました。
今回はnode-pg-migrate
でマイグレーションを行う方法を記事にしたいと思います。
node-pg-migrateの特徴
- TypeScriptでマイグレーション時のロジックを組み込むことが出来るため、複雑なマイグレーションが必要な時にも安心して対応することが出来る。
- ORMのエンティティベースでない。
node-pg-migrateでマイグレーションをして、
Drizzle kit`でDrizzle用のスキーマファイルを自動生成する。という流れで使いたいなと思っています。
導入から実行まで
事前準備
npmプロジェクトをinit
npm init
ライブラリのインストール
npm i pg node-pg-migrate dotenv
npm i -D typescript ts-node @types/pg @types/node
tsconfig.jsonを生成
npx tsc --init
package.jsonにコマンドを準備
scripts
に以下を追加する
"migrate": "ts-node node_modules/node-pg-migrate/bin/node-pg-migrate -j ts"
以上でマイグレーションを行う設定は終了です。
ここからマイグレーションのコードを作成していきます。
マイグレーションファイルを作成する
マイグレーションファイルの生成
以下のコマンドを実行します。
npm run migrate create {マイグレーションファイルの名前}
例
npm run migrate create initial_migration
./migrations
の中にマイグレーションファイルが作成されます。
マイグレーションファイルの編集
今回はsqlでマイグレーションを行いたいため、
./migrations/up/{生成されたマイグレーションファイル名(.tsより前)}_up.sql
を作成します。
このファイルの中に実行したいsqlを書いていきます。
続いて、
./migrations/down/{生成されたマイグレーションファイル名(.tsより前)}_down.sql
を作成して、リバートの時のsqlを記入していきます。
最後に生成されたマイグレーションファイルのTypeScriptのupとdownの関数を編集します。
./migrations/xxxx_initial-migration.ts
/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder, ColumnDefinitions } from 'node-pg-migrate';
import * as fs from 'fs';
import path from 'path';
export const shorthands: ColumnDefinitions | undefined = undefined;
export async function up(pgm: MigrationBuilder): Promise<void> {
const migrationFilePath = path.join(__dirname, "up","xxxx_initial-migration_up.sql")
const migrationSql = fs.readFileSync(migrationFilePath, "utf-8");
pgm.sql(migrationSql);
}
export async function down(pgm: MigrationBuilder): Promise<void> {
const migrationFilePath = path.join(__dirname, "down","xxxx_initial-migration_down.sql")
const migrationSql = fs.readFileSync(migrationFilePath, "utf-8");
pgm.sql(migrationSql);
}
以上でマイグレーションファイルの作成は完了です。
マイグレーションの実行
以下のコマンドでマイグレーションを実行することが出来ます。
npm run migrate up
リバートの実行
リバートの実行
npm run migrate down
以上でnode-pg-migrate
導入完了です!😊
その他のコマンドは以下のサイトに説明があります。
Discussion