sequelize - Node.js

sequelize とは

Node.js 上で ORM(Object-Relational Mapping) を提供するライブラリです。

Sequelize(シィークゥアラァィズ) を利用するために役立つコマンドを提供してくれます。

インストール

npm install -g sequelize-cli
npm install sequelize

データベースに MySQL を利用するなら次のコマンドも実行します。

npm install mysql2

ファイルの作成・削除

次のコマンドを実行すると、sequelize の初期化を行います。

sequelize init

config、migrations、models、seeders のディレクトリが作成されます。

config/config.json の内容を編集します。

mysql がインストールされた環境だと次のようになりました。自身の環境にあわせて編集します。

config/config.json

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

データベースの作成

次のコマンドを実行するとデータベースを作成できます。

sequelize db:create

次のようにすると db_test というデータベースが作成できます。

sequelize-cli db:create --env test

データベースを削除するには次のようにします。

sequelize db:drop

モデルの作成

次のコマンドを実行するとモデルが作成できます。

sequelize model:create --underscored --name user --attributes "name:string,age:integer"

マイグレーションの実行

sequelize db:migrate

シードデータ

シードファイルを作成するには次のようにします。

sequelize seed:generate --name ファイル名

上記のコマンドを実行すると、「 seeders 」というフォルダができます。その中に「 YYYYMMDDHHMMSS-ファイル名.js 」というファイルがあります。

「 sequelize seed:generate --name users 」という風に実行した場合、ファイルの中は次のようになります。

seeder/20240504111214-users.js

'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up (queryInterface, Sequelize) {
    /**
     * Add seed commands here.
     *
     * Example:
     * await queryInterface.bulkInsert('People', [{
     *   name: 'John Doe',
     *   isBetaMember: false
     * }], {});
    */
  },

  async down (queryInterface, Sequelize) {
    /**
     * Add commands to revert seed here.
     *
     * Example:
     * await queryInterface.bulkDelete('People', null, {});
     */
  }
};

データを投入するために「 20240504111214-users.js 」ファイルを以下のように編集します。

'use strict';

const data = [{
  name: "taro",
  mail: "example.com"
},{
  name: "hanako",
  mail: "example.co.jp"
}];

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up (queryInterface, Sequelize) {
    data.forEach((each) => {
      each.created_at = new Date();
      each.updated_at = new Date();
    });
    await queryInterface.bulkInsert('users', data, {});
  },

  async down (queryInterface, Sequelize) {
    await queryInterface.bulkDelete('users', null, {});
  }
};

シードデータをデータベースに挿入するには次のようにします。

sequelize db:seed:all

一番最後に実行したシードデータを取り消すには次のようにします。

sequelize db:seed:undo

指定したシードデータを削除するには次のようにします。

sequelize db:seed:undo --seed 20240504111214-users.js

「 seeders 」以下のすべてのシードデータを削除するには次のようにします。

sequelize db:seed:undo:all

データの保存

script.js

let db = require('./models/');

db.user.create({
  name: 'taro',
  age: 20
}).then((result) => {
  console.log(result);
  db.sequelize.close();
});

すべてのデータの取得

script.js

let db = require('./models/');

db.user.findAll().then((result) => {
  console.log(result);
  db.sequelize.close();
});

特定のデータを1つだけ取得する

script.js

let db = require('./models/');

db.user.findOne({
  where: { id: req.params.id }
}).then((user) => {
  console.log(user);
  db.sequelize.close();
});

データを更新する

update と save を使う方法があります。

save() は、findOne() などですでにデータを取得している場合などに利用できます。

update()

let db = require('./models/');

db.user.update(
  { name: "hanako", age: 25},
  { where: { id: 1} }
).then((result) => {
  console.log(result);
  db.sequelize.close();
});

save()

let db = require('./models/');

db.user.findOne(
  { where: { id: 1}}
).then((user) => {
  user.name = "hanako";
  user.age = 30;
  user.save().then(() => {
    db.sequelize.close();
  });
});

データの削除

let db = require('./models/');

db.user.findOne(
  { where: { id: 1}}
).then((user) => {
  user.destroy().then(() => {
    db.sequelize.close();
  });
});

該当するデータの件数を取得する

script.js

var db = require('../models/');

db.user.count({ where: { name: "test"}}).then((total) => {
  console.log(total)
});

直接クエリを実行する

script.js

var db = require('../models/');

db.sequelize.query("SELECT * FROM users WHERE id = '1'").then(users => {
  console.log(users);
});

replacement

script.js

var db = require('../models/');

db.sequelize.query("SELECT * FROM users WHERE id = :id", {
  replacements: { id: 1 }
}).then(users => {
  console.log(users);
});

replacements を使うとエスケープされるようです。

バリデーション

sequelize で、バリデーションを使うには、次のようにモデルを変更します。

models/user.js

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {

  const user = sequelize.define(
    'user', {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      name: {
        type: DataTypes.STRING,
        validate: {
          notEmpty: {
            msg: "名前が空欄です。"
          }
        }
      },
      age: {
        type: DataTypes.INTEGER,
        validate: {
          notEmpty: {
            msg: "年齢が空欄です。"
          },
          isInt: {
            msg: "数字を入力してください。"
          }
        }
      }
    }, {
        sequelize,
        modelName: 'user',
        underscored: true,
        version: true,
      }
  );

  user.associate = function(models) {
    // associations can be defined here
  };
  return user;
};

script.js

var db = require('../models/');

db.user.create({
    name: "",
    age: 20
  }).then((result) => {
    console.log(result);
    db.sequelize.close();
}).catch((error) => {
  console.log(error);
  db.sequelize.close();
})