
Sequelizeを使ってみた
December 19, 2015,
tags:
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.js
とuser.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.define
でforeignKey
でorganization_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とどう組み合わせようという話になってくる気もします。 基本的には以下の方法でプロジェクトの雛形を作る事をおすすめします。
- Express generatorでプロジェク生成
- sequelize initでSequlizeの設定をする
$ express myapp
$ cd myapp
$ sequelize init
サンプルもsequelize/express-exampleというのがあるので、確認してみると良いでしょう。