Help us understand the problem. What is going on with this article?

SequelizeとMySQLとExpressの簡単サンプル

More than 1 year has passed since last update.

はじめに

こちらの記事「Node.jsとExpressとMySQLの簡単サンプル」でNodeでMySQLを操作しました。

今回はNode向けのORMであるSequelizeを利用してMySQLを操作してみたいと思います。

Sequelize

公式サイト

PromiseベースのNode向けのORMで、PostgreSQL,MySQL,SQLite,MSSQLをサポートしているそうです。

ほんの少ししか触っていませんが、テーブルをModelとして扱う点はLaravelと似ているなと思いました(ORMのデファクトスタンダードなのか?ココらへんは無知・・・)

事前準備

Node.jsとExpressとMySQLの簡単サンプルと同じく、先にデータを作成しておきます。

全てmysqlログイン後

create database NodeTest;

use NodeTest;

create table test_table(id int(11),name varchar(255));

insert into test_table values(1,'testname');

インストール

npm install --save sequelize

利用するDBをインストール。

npm install --save pg pg-hstore
npm install --save mysql2
npm install --save sqlite3
npm install --save tedious

今回はMySQLのためnpm install --save mysql2

とりあえずデータ取得

ソースコード

置き場

index.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize('NodeTest','root','root',{dialect:'mysql'});
sequelize.query("select * from test_table").spread((results, metadata) => {
  console.log(results);
  sequelize.close();
})

new Sequelize('データベース名','ユーザー','パスワード',{dialect:'mysql'});

データベース名は今回作成したNodeTest

ユーザーはroot

パスワードはroot

dialectの値は今回MySQLなのでmysqlを指定

sequelize.queryでSQLを実行し、結果を表示して、sequelize.close()で終了させています。

モデルの利用

実はここで少しつまりました。(公式サイトをよく読んでいなかった)

最初公式通りに、モデルを利用するため下記のようなコードを書いていたのですが、エラーになる・・・。

const TestTable = sequelize.define('test_table', {
  id: {
    type: Sequelize.INTEGER,
  },
  name: {
    type: Sequelize.STRING
  }
});

※下記のコードは公式

const User = sequelize.define('user', {
  firstName: {
    type: Sequelize.STRING
  },
  lastName: {
    type: Sequelize.STRING
  }
});

ソースコード

既存のテーブルからモデルを作るときはいくつか設定が必要っぽく、最終的に下記コードになりました。

置き場

model.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize('NodeTest','root','root',{dialect:'mysql'});
const TestTable = sequelize.define('test_table', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true
  },
  name: {
    type: Sequelize.STRING
  }
},{
  freezeTableName: true,
  timestamps: false
});

TestTable.findAll().then(data => {
  console.log(data);
});

まず、idにprimaryKeyの設定が必要です。

これは下記のようにエラーが出ていたので分かりやすかったです。

throw new Error(`A column called 'id' was added to the attributes of'${this.tableName}' but not marked with 'primaryKey: true'`);

次にfreezeTableNameですが、設定していないと下記のようなエラーが出ます。

Unhandled rejection SequelizeDatabaseError: Table 'nodetest.test_tables' doesn't exist

どうやら、test_tablesという名前のテーブルが存在しないと怒られます。

確かに作ったのはtest_tableなので、存在しません。

これは、Sequelizeはモデルの名前を自動的に複数形に変換するそうです。

そのため、変換させないためにfreezeTableNameを設定します。

次にtimestampsですが、設定していないと下記のようなエラーが出ます。

Unhandled rejection SequelizeDatabaseError: Unknown column 'createdAt' in 'field list'

createdAtというカラムが無いと怒られるのですが、test_tableにはありません・・・。

Sequelizeはデフォルトでタイムスタンプを記録するので、昨日をオフにするためにtimestampsを指定します。

これで、既存のテーブルのモデルが作成できました!

データの取得はfindAllを使って取得できます。

ExpressとSequelize

最後にExpressとSequelizeを組み合わせてみます。

内容はNode.jsとExpressとMySQLの簡単サンプルと今回の組み合わせなので特に目新しいところはありません。

ソースコード

置き場

index.js
const express = require('express');
const app = express();
const Sequelize = require('sequelize');
const sequelize = new Sequelize('NodeTest','root','root',{dialect:'mysql'});
const TestTable = sequelize.define('test_table', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true
  },
  name: {
    type: Sequelize.STRING
  }
},{
  freezeTableName: true,
  timestamps: false
});

app.get('/', function (req, res) {
  TestTable.findAll().then(results => {
    res.send(results);
  });
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

所感

ORMになれないせいか、モデルという考え方が新鮮です。

今までSQLでしかDBを扱えなかったのが、JSのコードのみで扱えるのはすごい。

次はSequelizeでマイグレーションをやってみようと思います。

gamewith
GameWithは、ゲームをプレイされる皆様がより深くゲームを楽しんで頂ける環境を提供するべく設立されました。あなたがゲームをする時のお供になる。これが私達の目標です。
https://gamewith.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした