フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

expressでSequelizeのmigrateする手順とその他の関連コマンド

必要なpackageをインストール

npm install mysql2
npm install --save-dev sequelize-cli

sequelizeの初期化

npx sequelize init

下記の2つのファイルが作成される

  • config/config.json
{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  }
}
  • models/index.jsファイルは基本的にはいじらないです。

作成したいテーブル

コメント
id int 連番
user_name varchar(255) ユーザー名
mail_address varchar(255) メールアドレス
password varchar(255) パスワード
token varchar(255) トーク
login_failure_count int ログイン連続失敗回数
created_at datetime 登録日
updated_at datetime 更新日

Modelの作成

  • 上記のテーブルを作成する際に下記のコマンドを実行するとマイグレーションファイルとモデルのファイルが作成される。--underscoredのオプションをつけると登録日と更新日のフィールド名がcreated_atになり、オプションをつけないとcreatedAtになりますので、おこのみでつけてください。
npx sequelize model:generate --name user --underscored --attributes user_name:string,mail_address:string,password:string,token:string,login_failure_count:integer
  • migrations/20200505090006-create-user.jsというファイルができますので、created_atupdated_atにdefault値でSequelize.NOWを指定してください。指定しないとデータ登録時に自動で 登録日と更新日が反映されません。
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      user_name: {
        type: Sequelize.STRING
      },
      mail_address: {
        type: Sequelize.STRING
      },
      password: {
        type: Sequelize.STRING
      },
      token: {
        type: Sequelize.STRING
      },
      login_failure_count: {
        type: Sequelize.INTEGER,
        default: 0
      },
      created_at: {
        allowNull: false,
        type: Sequelize.DATE,
        default: Sequelize.NOW
      },
      updated_at: {
        allowNull: false,
        type: Sequelize.DATE,
        default: Sequelize.NOW
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('users');
  }
};

テーブルの作成

  • 下記のコマンドを実行すると先ほどconfig/config.jsonで指定したDBに対してテーブルを作成します。
npx sequelize-cli db:migrate
  • データベースを確認すると下記のようにテーブルが作成されていることを確認できます。
mysql> desc users;
+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int          | NO   | PRI | NULL    | auto_increment |
| user_name            | varchar(255) | YES  |     | NULL    |                |
| mail_address        | varchar(255) | YES  |     | NULL    |                |
| password            | varchar(255) | YES  |     | NULL    |                |
| token               | varchar(255) | YES  |     | NULL    |                |
| login_failure_count | int          | YES  |     | NULL    |                |
| created_at          | datetime     | NO   |     | NULL    |                |
| updated_at          | datetime     | NO   |     | NULL    |                |
+---------------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

migrate テーブル全部削除

  • migrateのすべてを取り消すコマンド
npx sequelize-cli db:migrate:undo:all 

seedデータ用ファイル作成

npx sequelize-cli seed:generate --name test-users
  • seedデータの作成するときのサンプルです。下記のように記述するとテストデータをDBに登録することが可能です。※上記のテーブルの例とことなりますが、イメージをつかんで頂ければと思います。
'use strict';
const crypto = require('../lib/crypto');

module.exports = {
  up: (queryInterface, Sequelize) => {
    const now = new Date();
    return queryInterface.bulkInsert('Users', [
      { firstName: 'hogehoge', lastName: 'hogehoge', age: 42, mailAddress: 'hogehoge', tel: 'hogehoge', password: crypto.sha256('password'), createdAt: now, updatedAt: now },
      { firstName: 'hogehoge', lastName: '山田', age: 31, mailAddress: 'hogehoge', tel: 'hogehoge', password: crypto.sha256('password1'), createdAt: now, updatedAt: now },
      { firstName: 'hogehoge',  lastName: 'hogehoge',  age: 20, mailAddress: 'hogehoge',tel: 'hogehoge', password: crypto.sha256('password2'), createdAt: now, updatedAt: now},
    ], {});   
  },

  down: (queryInterface, Sequelize) => {
   return queryInterface.bulkDelete('Users', null, {});
  }
};

seedデータ作成

npx sequelize-cli db:seed:all