nodeJSでつかえるMySQL ORMのSequelizeを触ってみる

SequelizeはnodeJSで使えるORM

npm install sequelizeでサラッとインストールできます.MySQL本体さえ入っていれば,すぐに使えます.

初期化

Sequelize自体は,requireして,必要な情報を与えてnewすれば簡単に初期化できます.

var Sequelize = require('sequelize').Sequelize;

var Seq = new Sequelize('データベース名', 'ユーザー', 'パスワード');

/*
hostとかportを指定するときはこう
var Seq = new Sequelize('データベース名', 'ユーザー', 'パスワード', {
    'localhost',
   3306
});
*/

モデルをつくる

最低限のモデルの定義.ここではUserモデルに対して,文字列型のユーザー名を定義しました.

var User = Sequelize.define('User', {
    name: Sequelize.STRING
});

DBへの反映と同期

定義したモデルは,SequelizeインスタンスのsyncメソッドでDBに反映・同期されます.

Seq.sync(function(errs)
{
    console.log('DATABASE SYNC', errs);
});

もうできた

この時点で,データベース上には下記のようなUsersテーブルが作れらているはずです.idやcreatedAt, updatedAtなどのフィールドは自動で追加されています.

CREATE TABLE IF NOT EXISTS `Users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

レコードの操作

定義されたモデルを操作して,レコードを追加したり更新したりします.

追加 ( INSERT )

Userモデルに新しいレコードを作るために,newします.

var newUser = new User({
    name: '新しいユーザー'
});

newUser.save();

saveメソッドでDBに保存されます.

更新 ( UPDATE )

findメソッドで特定して,プロパティ化されているフィールドの内容を変更してからsaveします.

User.find({
    id : 1
}, function(user) {
    user.name2 = '新しい名前';
    user.save(function(){
        // callback
    });
});

削除 ( DELETE )

更新と同じように特定してから,destoryメソッドを利用します.

User.find({
    id : 1
}, function(user) {
    user.delete(function(){
        // callback
    });
});

メソッドも定義したりして,ちょっと凝ったモデル

requireと似たようなノリで,別のファイルからモデル部分をimportすることができます.

var Card = Seq.import(__dirname + "/model/card.js").Card;

モデルにメソッドを定義したりすると,長くなるので,実際はmodelディレクトリ等の中に個別にjsファイルを用意して管理しています.

タイムカードのモデルサンプル

classMethodsの中に関数を定義すると,クラスメソッド(newしていない状態で使う)を作っておくことができます.

exports.getCardClass = function(Sequelize, ORM) {
// cards
ORM.define('Card', {
    date        : Sequelize.STRING,
    come_time   : Sequelize.DATE,
    left_time   : Sequelize.DATE,
    out_time    : Sequelize.DATE,
    back_time   : Sequelize.DATE,
    user_id     : Sequelize.INTEGER
},{
    classMethods: {
        // 指定されたフィールドに,現在の日時を代入して更新するメソッド
        'update': function(param, callback) {
            var field = param.field,
                now   = param.now || new Date(),
                Card  = this;
           
            // 本日の日付の,指定されたuser_idのレコードがあるかfind
            Card.find({
                date    : getDate(now), // yyyy-mm-dd の形式で文字列を返す関数
                user_id : 1
            }, function(card) {

                // もしも見つからなければ新規レコードとしてnewします
                if ( card === null ) {
                    card = new Card({
                        date      : getDate(now),
                        user_id   : 1
                    });
                }

                // フィールドがSequelize.DATEで定義されていれば,Dateを直接渡せます
                card[field] = now;

                // セーブします
                card.save(callback);
            });
        },
        'delete': function() {

        }
    }
});
};

classMethodsと同様に,instanceMethodsに関数を定義しておくと,インスタンスメソッド(インスタンス化された後に使う)を作っておくこともできます.

クラスメソッドに定義されたupdateを使ってみる

たとえば,自分で定義したupdateメソッドは以下のように利用します.expressを利用しています.

// 出社なう
app.post('/come', function(req, res) {
    Card.update({
        field   : 'come_time'
    }, function()
    {
        res.redirect('/');
    });
});
// 退社なう
app.post('/left', function(req, res) {
    Card.update({
        field   : 'left_time'
    }, function()
    {
        res.redirect('/');
    });
});
// (以下略)

各POSTリクエストをうけて,それぞれのフィールドをupdateメソッドを使って更新し,リダイレクトさせています.

使い方さえ掴めば,手軽に取り回せます

実は今までPHPでもORMらしきものを扱ったことはなかったのですが,そんな自分でも以下の公式サイトと,導入記事だけで何となく使えるようになりました.公式サイトのドキュメントを見ていると,もっと凝った事もできそうです.

簡単なアプリを手早く用意するだけなら,今回紹介したぐらいの使い方でも十分そうですね.

参考サイト