Node.js Sequelizeでマイグレーションを行う手順




Sequelizeとは

まず読み方ですが、シィークゥアラァィズって読むみたいです。読みにくいですね。。。

SequelizeはNode.jsで使えるORMでMySQL、Postgres、SQLite、Microsoft SQL Serverに対応しています。RailsにインスパイアされているっぽいのでRailsを使ったことがある人はすぐに馴染めるかと思います。

インストール

まずインストールですがnpmモジュールなので下記でインストールします。

npm install --save sequelize
npm install -g sequelize-cli

sequelizeがアプリケーションで使用するもので、sequelize-cliがマイグレーションコマンドを実行するものです。

下記コマンドを実行するとconfig,models,migrations,seedersディレクトリが雛形として作成されます。

sequelize init

DB設定

まずはじめにDB情報をconfig内に設定します。config/config.jsonが下記のようになっているので下記設定でデータベースを作成するか設定を変更してください。デフォルトではdevelopmentの設定が読み込まれます。

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

テーブル作成

下記コマンドでモデルファイル、マイグレーションファイルが生成されます。

sequelize model:create --underscored --name user --attributes "user_name:string,age:integer,delete_flag:boolean"

–underscoreはデフォルトで追加されるcreated_atとupdated_atカラムがスネークケースになります。

定義を修正したい場合は–forceオプションをつけるとマイグレーションファイルを新規で作成し、モデルファイルは上書きしてくれます。古いマイグレーションファイルを削除するのを忘れないようにしてください。

生成されたモデルファイルは下記のようになっています。

'use strict';
module.exports = function(sequelize, DataTypes) {
    var user = sequelize.define('user', {
        user_name: DataTypes.STRING,
        age: DataTypes.INTEGER,
        delete_flag: DataTypes.BOOLEAN,
    }, {
        underscored: true,
        classMethods: {
            associate: function(models) {
                // associations can be defined here
            }
        }
    });
    return user;
};

マイグレーションの実行

–envオプションで環境を指定できます。

sequelize db:migrate --env development

実際のテーブル定義は下記になります。idカラムは自動で追加されます。

mysql> desc users;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_name      | varchar(255) | NO   |     | NULL    |                |
| age            | int(11)      | NO   |     | 0       |                |
| delete_flag    | tinyint(1)   | NO   |     | 0       |                |
| created_at     | datetime     | NO   |     | NULL    |                |
| updated_at     | datetime     | NO   |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+

書き方のこだわりになってしまうのですが、プログラム上でカラム名をスネークケースで扱いたくないので下記のようにモデルファイルを書き直します。こうすることでプログラム上ではカラム名をキャメルケースで扱えます。

'use strict';
module.exports = function(sequelize, DataTypes) {
    var user = sequelize.define('user', {
        userName: {
            type: DataTypes.STRING,
            field: 'user_name'
        },
        age: {
            type: DataTypes.INTEGER,
            field: 'age'
        },
        deleteFlag: {
            type: DataTypes.BOOLEAN,
            field: 'delete_flag'
        },
        createdAt: {
            type: DataTypes.DATE,
            field: 'created_at'
        },
        updatedAt: {
            type: DataTypes.DATE,
            field: 'updated_at'
        }
    }, {
        underscored: true,
        classMethods: {
            associate: function(models) {
                // associations can be defined here
            }
        }
    });
    return user;
};

まとめ

  • Sequelize-cliをインストールする
  • config.jsonにDB情報を設定する
  • コマンドラインでカラムを指定してマイグレーションファイルを作成する
  • sequelize db:migrate env development でマイグレートする

Railsライクに簡単にマイグレーションできることがわかった思います。次回はSequelizeをどう使うかまとめたいと思います。

最後にMySQLの絵文字設定もしておくといいと思うので下記リンクを参考にしてみてください。

MySQLで絵文字utf8mb4を使う設定

おすすめ書籍

基礎から応用までサンプルコードを使って解説しており、Node.jsが初めての人でも読める技術書となっています。上級者向けにはExpressフレームワークを使った実用的な開発手法の解説もありこれからアプリケーションを開発する人の参考になると思います。現状では書き方が古くなっていますが、Node.jsの初心者から上級者で学ぶことの多い書籍です。

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら



2 件のコメント

    • 参考になったみたいでよかったです!わかりづらいやもっとここを教えて欲しいなどありましたらご連絡ください!!

  • コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です