SequelizeのGetting Startedを試してみる

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
```

つぎにＤＢのドライバを入れます。
`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
コネクションの設定をします。
１アプリケーションにつき１コネクションプールが推奨されているようです。

名前は適当に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)
...
```

ＤＢの中を見てみましょう。
`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)
```

作成できてますね。この状態だとテーブルの再作成が行われるので、何度実行しても１レコードです。
せっかくなので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を試してみたいと思います。