Help us understand the problem. What is going on with this article?

Node.jsを使ったMigration機能を使ってみた

More than 3 years have passed since last update.

はじめに

自宅のPC、ノートパソコン、研究室のPCで開発することがあり、ソースコードはGitで管理しているからストレスはないが、
DBは手動で書き換えを行っており、書き換え忘れによるバグや変更点を思い出すので無駄な時間がかかる
そんな時バイト先でRubyやCakePHPなどにはMigrationという機能があるということを聞いて、Node.jsを使ってやってみたいと思い調べてみた
Node.jsを使ってのMigrationの記事が少なかったので書いてみようと思う
※OSはWindows,MacOSで行いました

データベースマイグレーションとは

データベースを削除してから作り直すと、DBに保存されている情報が全て削除されてしまう
こういった事態を回避する方法として、データベースマイグレーションを行う方法がある
マイグレーションとは、DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更などを行うための機能
詳しいことはこちらなどを呼んでください

前提

  • npmが実行できる環境が整っている
  • MySQLを使える環境が整っている

Node.jsでMigratinoを行う

Migrationが行えるモジュールはたくさんあるが、今回はいろいろ試してうまくいったdb-migrateモジュールを利用する

プロジェクトを作成する

$ mkdir プロジェクト名
$ cd プロジェクト名
$ npm init
// Enter連打

db-migrateをインストール

db-migrateコマンドを利用するのでグローバルにインストールする

$ npm install -g db-migrate

下記のコマンドを実行

$ db-migrate

以下の画像が表示されたらインストール成功

skitch (3).png

DBの情報を設定ファイルに記述

プロジェクト名ディレクトリの中にdatabase.jsonファイルを作成する
ここにMigrationを行うDBの情報を記述する

$ pwd
/Users/Hoge/プロジェクト名
$ touch database.json

設定するデータベースを作成する

$ mysql.server start
$ mysql -u root -p
password


mysql> create database migration;

database.jsonに設定を記述する

database.json
{
    "dev": {
        "driver": "mysql", //DBの種類
        "user": "root", //ログインするユーザ名
        "password": "root", //ユーザのパスワード
        "database": "migration" //Migrationを行うデータベース名
    }
}

Migrationファイルを作成する

下記のコマンドを実行して以下の画像のように表示されればMigrationファイルの作成に成功
失敗する場合、設定ファイルがうまくいっていない可能性あり

$ db-migrate create create_table_hoge

skitch (2).png

プロジェクト名/migrations ディレクトリにMigrationファイルが作成されている

MigrationファイルにDBの操作を記述する

作成した時間-createコマンドでの引数名.jsファイルにDBの操作を記述していく
(上記のコマンドの場合、例:20170212082607-create-table-hoge.js)

20170212082607-create-table-hoge.js
'use strict';

var dbm;
var type;
var seed;

/**
  * We receive the dbmigrate dependency from dbmigrate initially.
  * This enables us to not have to rely on NODE_PATH.
  */
exports.setup = function(options, seedLink) {
  dbm = options.dbmigrate;
  type = dbm.dataType;
  seed = seedLink;
};

exports.up = function(db) {
  /**
    * 以下のコードを記述
    */
  db.createTable('hoge', {
    id: {type: 'int', primaryKey: true},
    name: 'string'
  });
  return null;
};

exports.down = function(db) {
  /**
    * 以下のコードを記述
    */
  db.dropTable('hoge');
  return null;
};

exports._meta = {
  "version": 1
};

Migrationファイルを利用してDBを操作する

db-migrateがDBの操作を行うにはdriverが必要みたいなのでインストールする
(ローカルで大丈夫)

$ npm install db-migrate-mysql

upコマンドを使ってexports.up()メソッドの中身を実行する

$ db-migrate up

以下のように表示されたら成功
失敗した場合、ログインしたユーザ名やパスワード、そのユーザの権限などに原因がある可能性あり

skitch (1).png

変更が行われているか確認する

mysql> use migration
mysql> show tables;
テーブルが作成されていることを確認
mysql> show columns from hoge;
カラムが正しいか確認

downコマンドを使ってexports.down()メソッドの中身を実行する

$ db-migrate down

以下のように表示されたら成功

skitch.png

変更が行われているか確認する

mysql> show tables;
テーブルが消えてることを確認

最後に

省いたところも多くありますが、出来る限り丁寧に書きました
カラムの追加や削除などは以下の参考サイトに記載されているので、気になる人は見てください
DBへの操作(テーブルの作成やカラムの変更)を行うたびにcreateコマンドを使ってMigrationファイルを作成するようです
よってdb-migrate create 操作する名前などが良いみたい
upやdownの操作の履歴はmigrationsテーブルに残してるそうです
この記事内以外でも質問があれば、コメントやTwitter、メールなどをください

参考サイト

ハードコイルド・ワンダーランド|node-db-migrate便利
db-migrate

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした