LoginSignup
6
6

More than 5 years have passed since last update.

SequelizeのGetting Startedを試してみる

Last updated at Posted at 2015-03-20

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を試してみたいと思います。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6