polidog lab++

Blog
Sequelizeを使ってみた

Sequelizeを使ってみた

Dec 19, 2015 | tech | nodejs sequelize

久しぶりにNodeJsでwebアプリを作っています。
完全に趣味で、仕事でやっているわけではありません。

O/Rマッパー的なものを使いたくて、調べていましたが最初に検索で引っかかった「Sequelize」を使ってみました。

インストール方法

npmのパッケージなので、npmインストールしましょう。 ちなみに今回はmysql使うことを想定しています。

$ npm install --save sequelize mysql

基本的にsequelizeをインストールすればいいのですが、Migration機能も使いたいので今回はsequelize-cliもインストールします。

$ npm install -g sequelize-cli

初期化を行う

sequelize-cliを使ってmodelsディレクトリの生成やconfigの生成をします。

$ sequelize init

これでmodels,migrations,configなどのディレクトリが生成されます。

sequelizeコマンドは他にもマイグレーションやモデルの作成など様々なコマンドがあるのでヘルプコマンドで確認しておきましょう。

$ sequelize help

モデルを作ってみる

「テーブル=モデル」という表現は嫌いなんですが、「郷に入っては郷に従え」という事でモデルを作るとあえて言います。

今回はUserモデルと、Organizationモデルを作ります。

$ sequelize model:create --name User --attributes "name:string, email:string, password:string, is_owner:boolean, created_at:date, updated_at:date"
$ sequelize model:create --name Organization --attributes "name:string, slug:string, created_at:date, updated_at:date"

modelsディレクトリにorganization.jsuser.jsが作成されました。

アソシエーション

アソシエーションも比較的簡単に出来ます。 一般的にある以下のアソシエーションの設定ができます。

  • BelongsTo
  • HasOne
  • HasMany
  • BelogsToMany(n:m)

詳しいことはマニュアルを見ましょう。

今回はUserモデルにBelongsToでOrganizationモデルを指定しましょう。

'use strict';
module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define('User', {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING,
    is_owner: DataTypes.BOOLEAN,
    created_at: DataTypes.DATE,
    updated_at: DataTypes.DATE
  }, {
    classMethods: {
      associate: function(models) {
        User.belongsTo(models.Organization)
      }
    }
  });
  return User;
};

associateの部分にbelongsToを記述するだけで大丈夫です。 なぜこのような書き方をするのか気になる方はmodels/index.jsのコードを読めば理解できます。

カラムを追加してみる

このアソシエーションは動かないんです・・・ 実行してみるとわかるんですが、Unknown column 'OrganizationId' in 'field list'って出てエラーになるんですよ。

まあそりゃそうですよね。Organizationテーブルとどうやってリレーションするのかって話ですよね。

ということでカラムを追加してみましょう。 カラムを追加する際に必要な作業としては以下のとおりです。

  • Userモデルの修正
  • Migrationの雛形を作成して、変更を記述する
  • Migrationの実行

モデルの修正

以下のように修正します。 sequelize.defineforeignKeyorganization_idを用意。 そしてassociateの部分でforeignKeyを指定しました。

'use strict';
module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define('User', {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING,
    is_owner: DataTypes.BOOLEAN,
    organization_id: DataTypes.INTEGER,
    created_at: DataTypes.DATE,
    updated_at: DataTypes.DATE
  }, {
    classMethods: {
      associate: function(models) {
        User.belongsTo(models.Organization,{"foreignKey": "organization_id"})
      }
    }
  });
  return User;
};

Migrationの雛形を作成して、変更を記述する

sequelizeコマンドを使ってmigrationファイルの雛形を生成します。

$ sequelize migration:create

そして以下のように変更点を記述します。

'use strict';

module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.addColumn(
      'Users',
      'organization_id',
      {
        type: Sequelize.INTEGER,
        allowNull: false
      }
    );
  },

  down: function (queryInterface, Sequelize) {
    return queryInterface.removeColumn(
      'Users',
      'organization_id'
    );
  }
};

Migrationの実行

ファイルのようにができたら、マイグレーションを実行します。

$ sequelize db:migrate

これで変更がDBに反映されます。

最後に

Expressとどう組み合わせようという話になってくる気もします。 基本的には以下の方法でプロジェクトの雛形を作る事をおすすめします。

  1. Express generatorでプロジェク生成
  2. sequelize initでSequlizeの設定をする
$ express myapp
$ cd myapp
$ sequelize init

サンプルもsequelize/express-exampleというのがあるので、確認してみると良いでしょう。

comments powered by Disqus

関連記事

© 2017 polidog lab++