http://docs.sequelizejs.com/en/latest/docs/getting-started/
SequelizeのGetting Startedを試していきます。環境はcloud9上でdbはmysqlです。
Installation
Sequelizeをインストールします。
npm install --save sequelize
できました。2015/3時点では2.0.4のようです。
sequelize@2.0.4 node_modules/sequelize
├── dottie@0.2.4
├── toposort-class@0.3.1
├── generic-pool@2.1.1
├── inflection@1.5.3
├── node-uuid@1.4.3
├── validator@3.22.2
├── bluebird@2.4.2
├── lodash@2.4.1
└── moment@2.9.0
つぎにDBのドライバを入れます。
npm install --save mysql
できました。
mysql@2.5.5 node_modules/mysql
├── require-all@1.0.0
├── bignumber.js@2.0.0
└── readable-stream@1.1.13 (isarray@0.0.1, inherits@2.0.1, string_decoder@0.10.31, core-util-is@1.0.1)
Setting up a connection
コネクションの設定をします。
1アプリケーションにつき1コネクションプールが推奨されているようです。
名前は適当にapp.jsとしファイルを作成します。
サンプルをcloud9用に編集しました。
参考:cloud9: Setting Up MySQL
https://docs.c9.io/v1.0/docs/setting-up-mysql
var Sequelize = require('sequelize')
var IP = process.env.IP
var username = process.env.C9_USER
var password = null
var sequelize =
new Sequelize('c9', username, password, {
host: IP,
port: 3306,
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 10000
},
});
この段階ではポート等が間違っていてもエラーはでないようです。
Your first model
モデルの作成です。そのままapp.jsに続けて記載します。特にサンプルからの変更点はないです。
var User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING,
field: 'first_name' // Will result in an attribute that is firstName when user facing but first_name in the database
},
lastName: {
type: Sequelize.STRING
}
}, {
freezeTableName: true // Model tableName will be the same as the model name
});
User.sync({force: true}).then(function () {
// Table created
return User.create({
firstName: 'John',
lastName: 'Hancock'
});
});
実行結果はこんな感じ。force: trueなのでDROP文が動きます。
Executing (default): DROP TABLE IF EXISTS `user`;
Executing (default): CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER NOT NULL auto_increment , `first_name` VARCHAR(255), `lastName` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `user`
Executing (default): INSERT INTO `user` (`id`,`first_name`,`lastName`,`updatedAt`,`createdAt`) VALUES (DEFAULT,'John','Hancock','2015-03-20 04:10:16','2015-03-20 04:10:16');
データベースの設定が間違っているとこんな感じでエラーがでます。以下はポート番号を間違えた場合です。
Possibly unhandled SequelizeConnectionRefusedError: connect ECONNREFUSED
at Handshake._callback (/home/ubuntu/workspace/Sequelize/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:47:20)
...
DBの中を見てみましょう。
mysql-ctl cli
mysql> show tables from c9;
+--------------+
| Tables_in_c9 |
+--------------+
| user |
+--------------+
1 row in set (0.00 sec)
mysql> select * from c9.user\G
*************************** 1. row ***************************
id: 1
first_name: John
lastName: Hancock
createdAt: 2015-03-20 04:16:28
updatedAt: 2015-03-20 04:16:28
1 row in set (0.00 sec)
作成できてますね。この状態だとテーブルの再作成が行われるので、何度実行しても1レコードです。
せっかくなのでsync force: true を falseにして名前も変えてもう一度実行してみました。
User.sync({force: false}).then(function () {
Executing (default): CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER NOT NULL auto_increment , `first_name` VARCHAR(255), `lastName` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `user`
Executing (default): INSERT INTO `user` (`id`,`first_name`,`lastName`,`updatedAt`,`createdAt`) VALUES (DEFAULT,'Yamada','Taro','2015-03-20 04:25:53','2015-03-20 04:25:53');
mysql> select * from c9.user\G
*************************** 1. row ***************************
id: 1
first_name: John
lastName: Hancock
createdAt: 2015-03-20 04:16:28
updatedAt: 2015-03-20 04:16:28
*************************** 2. row ***************************
id: 2
first_name: Yamada
lastName: Taro
createdAt: 2015-03-20 04:25:53
updatedAt: 2015-03-20 04:25:53
2 rows in set (0.00 sec)
ちゃんと増えましたね。
# Application wide model options
最後はnew Sequelize の defineオプションは全モデルに適応されますよというお話。サンプルに従いsequelizeのコンストラクタの末尾にdefineを追加します。
var sequelize =
new Sequelize('c9', username, password, {
...
define: {
timestamps: false // true by default
}
});
sync force: tureに直してから実行しましょう。
mysql> select * from c9.user\G
*************************** 1. row ***************************
id: 1
first_name: Yamada
lastName: Taro
1 row in set (0.00 sec)
タイムスタンプがなくなりました。
以上でSequelizeのGetting Startedは終わりです。
次はmigrationを試してみたいと思います。