Node.js向けORM Sequelize

Node.js 向け ORM のSequelizeを触ってみます。
rails を触っていたときに ORM に興味を持ったので、調べてたら見つけました。

目次

参照資料

実行環境

  • Windows10 Pro
  • MariaDB 10.3

インストール - コンソールでデータ参照

初期設定

以下コマンドを順に入力し初期設定を行いました。

1
2
3
4
5
npm init -y
npm install --save sequelize
npm install --save mysql2
npm install --save-dev sequelize-cli
npx sequelize-cli init

ここまでで作成されているconfig/config.jsonを編集

config.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"development": {
"username": "root",
"password": "任意のパスワード",
"database": "database_development",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "root",
"password": "任意のパスワード",
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": "任意のパスワード",
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}

データベース作成

config/config.jsonの内容に基づいて、データベースを作る。

1
npx sequelize-cli db:create

モデル作成

今回は、名前(name)と、年齢(age)を持つ User モデルを作成する。

1
npx sequelize-cli model:generate --name User --attributes name:string,age:integer

マイグレーション

1
npx sequelize-cli db:migrate

テストデータ設定

以下のコマンドを入力,seders/[数字列]-demo.jsが作成される。

1
npx sequelize-cli seed:generate --name domo

以下のようにseeders/[数字列]-demo.jsを書き換える。

seeders/[数字列]-demo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"use strict";

module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.bulkInsert(
"Users",
[
{
name: "A-A",
age: 30,
createdAt: new Date(),
updatedAt: new Date(),
},
],
{}
);
},

down: (queryInterface, Sequelize) => {
return queryInterface.bulkDelete("Users", null, {});
},
};
1
npx sequelize-cli db:seed:all

ここで、mariadb をコンソールで参照し、テストデータが挿入されていることを確認しておく。

プログラムからデータ参照

Sequelize を用いたデータへのアクセスはやり方がいくつかある。

クエリを直接実行

DB アクセス用のパラメータは param.js に分離しておく。

/src/index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
const Sequelize = require("Sequelize");
const dbParam = require("./param");

const sequelize = new Sequelize(
dbParam.database,
dbParam.username,
dbParam.password,
dbParam.options
);

sequelize.query("select * from users").then(function (users) {
console.log(JSON.stringify(users));
});
/src/param.js
1
2
3
4
5
6
7
8
9
module.exports = {
database: "database_development",
username: "root",
password: "任意のパスワード",
options: {
host: "localhost",
dialect: `mysql`,
},
};

以上をnode ./src/index.jsで実行すると、テーブルの内容がコンソールに表示される。

モデルを利用

index.js
1
2
3
4
5
const models = require("../models");

models.User.findAll().then((users) => {
console.log(JSON.stringify(users));
});

Sequelize を読み込んで無いように見えるけど、./models/index.jsの中で
const Sequelize = require('sequelize');されている。

以上をnode ./src/index.jsで実行すると、テーブルの内容がコンソールに表示される。

findAll 他のモデルの操作関数はSequelize - API Reference - Modelに記載がある。


今回は Sequelize を使ってみました。
基本的には、モデル利用でアクセスしないと ORM 使ってる意義がないかなという感じでした。

Express と Sequelize で rails っぽい API サーバを docker で環境用意して作ろうとしたら、Sequelize でつまずいたので、一旦ちゃんと Sequelize のみ取組み。
経験無い・浅い事を複合した問題は、分解しないとだめですね。やっぱり。

ではでは