sequelizeパッケージを初心者が使ってみる。

###sequelizeとは
Node.jsにはデータベースを利用するためのパッケージがたくさん存在します。
しかし、データベースを扱うにはSQLというデータベースを操作する言語が必要になります。
sequelizeというパッケージを使えば、SQLを知らなくても、Node.jsでデータベースを利用することができます。


#####さらに詳しく
sequlizeは公式によるとORM（Object-relational mapping, オブジェクト関係マッピング）と呼ばれるものらしいです。
以下は引用です。

>オブジェクト指向の概念とリレーショナルデータベースの概念を橋渡しする役割がORMです。オブジェクト指向とリレーショナルデータベースの相性はそれぞれの概念が異なるため、相性が良くありません。なぜなら、オブジェクト指向では、データをオブジェクトとして扱うのですが、リレーショナルデータベースではデータを2次元の表として扱うためギャップが生じてしまいます。ORMを利用することによって、オブジェクトとデータベース問い合わせの相互変換を行います。
**引用:[ORMとは？](https://codezine.jp/article/detail/5858)**

sequlizeはPostgreSQL、MySQL、MariaDB、SQLite、MicrosoftSQLServerに対応しているそうです。

#sequlizeを利用してみる。
今回はsequlizeでpostgreSQLを利用してみます。

#####前提として以下を完了しておいてください。
① Node.jsのイントール
② Yarnのインストール
③ PostgreSQLのインストール　参考：https://lets.postgresql.jp/map/install

sequlizeを使う前にデータベースを作っておきます。
PostgreSQLのpsqlターミナルを起動し、以下のコマンドを入力してください。

```
$ create database rensyu;
```
データベース名は何でも構いません。
ここではrensyuとしておきます。

データベースが完成したら、sequelizeのインストールを行なっていきます。
以下のコマンドを入力してください。

```
$ yarn add sequelize
$ yarn add pg
$ yarn add pg-hstore
```
参照：[sequelize入門](https://sequelize.org/v4/manual/installation/getting-started)

インストールが終わったら、
sequelizeを利用するためのJSファイルを準備し、
そのファイル内に以下を書き込みます。
今回はシンプルにIDと名前と年齢だけのデータベースを作っていきます。

```JS:post.js
'use strict';
const Sequelize = require('sequelize');
const sequelize = new Sequelize(
  'postgres://postgres:postgres@localhost/rensyu',
  {
    logging: false,
    define: {
      freezeTableName: true,
      timestamps: true
    }
  });
const Post = sequelize.define('Post', {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  name: {
    type: Sequelize.STRING
  },
  age: {
    type: Sequelize.INTEGER
  }
});

Post.sync();
module.exports = Post;
```
解説をしていきます。

```JS
const sequelize = new Sequelize(
  'postgres://postgres:postgres@localhost/rensyu',
  {
    logging: false,
    define: {
      freezeTableName: true,
      timestamps: true
    }
  });
```
これは、sequelizeのインスタンスを作成しています。
その際に、接続するデータベースを先ほど作成したものに設定しています。
postgresql://{ユーザー名}:{パスワード}@{ホスト名}/{データベース名}というようになっています。自分で作ったPostgreSQLのユーザー名やパスワードを利用してください。
loggingはデータベースに接続する際、コンソールログを行わない設定です。
defineのfreezeTableName: trueはテーブル名を固定する設定です。
固定しないと、'Post'とテーブル名を定義しても、'Posts'というテーブル名に保存されることになってしまいます。つまり、勝手に複数形のテーブル名で保存されてしまうということです。
timestampは自動的にcreatedAtという作成日時とupdatedAtという更新日時を自動的に追加してくれる設定です。

```JS
const Post = sequelize.define('Post', {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  name: {
    type: Sequelize.STRING
  },
  age: {
    type: Sequelize.INTEGER
  }
});
```
こちらはデータベースのテーブルやデータを定義し、Postというオブジェクトに代入しています。
'Post'はテーブル名です。
id, name, ageはテーブルの列です。
それぞれに数字であるのか、文字であるのかなどの設定がされています。
idのprimaryKey: trueというのは、データベースを操作する上で参照の対象となる主キーを、idに設定しているという意味です。

```JS
Post.sync();
module.exports = Post;
```
Post.sync();は、定義したPostというオブジェクトをデータベースに適用して同期を取っています。
module.exports = Post;は、オブジェクト自体をモジュールとして公開しています。

この他にもいろいろな設定オプションがあります。
https://sequelize.org/master/manual/getting-started.html


それでは、以上のデータベースを使ってみましょう。
適当なファイルを用意し、以下のような記述をします。

```JS:post-handler.js
const Post = require('./post');
Post.create({
    name: name,
    age: age
  });
```

const Post = require('./post');はモジュールをインストールしています。
Post.createでデータベースにデータを保存しています。
あとは、EJSやPugなどのテンプレートエンジンを使えば、nameとageに好きな値を入れて保存ができます。

以上です。

参考：[sequelize APIリファレンス](https://sequelize.org/master/manual/getting-started.html)
参考：[N予備校 プログラミングコース](https://www.nnn.ed.nico/courses/497/chapters/6890)