nodeJSでつかえるMySQL ORMのSequelizeを触ってみる
Posted: Updated:
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らしきものを扱ったことはなかったのですが,そんな自分でも以下の公式サイトと,導入記事だけで何となく使えるようになりました.公式サイトのドキュメントを見ていると,もっと凝った事もできそうです.
簡単なアプリを手早く用意するだけなら,今回紹介したぐらいの使い方でも十分そうですね.
参考サイト
- Sequelize » A MySQL Object-Relational-Mapper for NodeJS
- sequelize: ORM for MySQL and Node.js - The Changelog - Open Source moves fast. Keep up.