Node Js アプリで Sequelize ORM を使用する方法


Sequelize は、GitHub で 25.36k スターを獲得している、非常に人気があり安定した Promise ベースの Node.js ORM であり、Postgres、MySQL、MariaDB、SQLite、Microsoft SQL Server などの SQL データベースを SQL に変換するためのマッピング ツールまたはオブジェクト リレーショナル マッパーです. JavaScript オブジェクトへのステートメント.トランザクション、リレーションシップ、遅延読み込みと不安読み込み、読み取りレプリケーションなどを強力にサポートします.

現在のバージョンは Sequelize v6 で、Node v10 以降をサポートしています.

前提条件



このチュートリアルでは、次のものがあることを前提としています.
  • Node.jsの基礎知識
  • マシンにインストールされたノード
  • 任意のコードまたはテキスト エディター
  • ローカルにインストールされた mysql、mariadb、postgresql、または sqlite3 などの少なくとも 1 つのデータベース

  • Sequelize は npm 経由で利用できます.プロジェクトに依存関係としてsequelizeをインストールする必要があります.

    npm install --save sequelize 
    


    また、選択したデータベースに対して、次のドライバーのいずれかを手動でインストールする必要があります.

    npm install --save pg pg-hstore (Postgres 用)
    npm install --save mysql2 (mysql 用)
    npm install --save mariadb (mariadb 用)
    npm install --save sqlite3 (sqlite3 用)
    npm install --save tedious (Microsoft SQL Server の場合)

    データベースへの接続



    データベースに接続するには、Sequelize インスタンスを作成する必要があります.

    このために、sequelize-connection.js のような新しいファイルを作成します.

    続編-connection.js

    const { Sequelize } = require('sequelize');
    


    データベースへの接続



    パラメータを個別に渡す (他の方言)

    const sequelize = new Sequelize('database', 'username', 'password', {
      host: 'localhost',
      dialect: 'mysql' || 'mariadb' || 'postgres' || 'mssql'
    });
    
    module.exports = sequelize;
    


    接続のテスト




    const { sequelize } = require('./models');
    


    .authenticate() 関数を使用して、接続が正常かどうかをテストできます.

    try {
        await sequelize.authenticate();
        // await sequelize.sync({ force: true, logging: console.log });
        console.log(`Server started on http://localhost:${port}`);
        console.log('Database connection has been established successfully.');
      } catch (error) {
        console.error('Unable to connect to the database:', error);
    }
    


    接続を閉じる



    Sequelize はデフォルトで接続を開いたままにし、すべてのクエリに同じ接続を使用します.接続を閉じる必要がある場合は、sequelize.close() を呼び出します (これは非同期で、Promise を返します).

    モデルを作成するには

    const { DataTypes } = require('sequelize');
    const sequelize = require('./index');
    
    const User = sequelize.define('users', {
      firstname: {
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
          notNull: { msg: 'User must have a firstname' },
          notEmpty: { msg: 'firstname must not be empty' },
        },
      },
      lastname: {
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
          notNull: { msg: 'User must have a lastname' },
          notEmpty: { msg: 'lastname must not be empty' },
        },
      },
      email: {
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
          notNull: { msg: 'User must have a email' },
          notEmpty: { msg: 'Email must not be empty' },
          isEmail: { msg: 'Must be a valid email' },
        },
      },
    });
    


    これで、Sequelize を使用して CRUD 操作を実行し、データベースにデータを保存する単純な Node.js/Express.js アプリケーションを作成する準備が整いました.

    新しいユーザーを追加

    app.post('/users', async (req, res) => {
      try {
        let { firstname, lastname, email } = req.body;
    
        firstname = firstname.toLowerCase().trim();
        lastname = lastname.toLowerCase().trim();
        email = email.toLowerCase().trim();
    
        const user = await User.create({ firstname, lastname, email });
    
        return res.status(201).json({ status: true, data: user });
      } catch (error) {
        res.status(500).json({
          status: false,
          errors: Object.values(error.errors).map((el) => el.message),
        });
      }
    });
    


    すべてのユーザーを一覧表示する

    app.get('/users', async (req, res) => {
      try {
        const user = await User.findAll();
        return res.status(200).json({ status: true, data: user });
      } catch (error) {
        res.status(500).json({
          status: false,
          errors: Object.values(error.errors).map((el) => el.message),
        });
      }
    });
    


    1 人のユーザーを検索する

    app.get('/users/:id', async (req, res) => {
      try {
        const user = await User.findAll({ where: { id: req.params.id } });
        return res.status(200).json({ status: true, data: user });
      } catch (error) {
        res.status(500).json({
          status: false,
          errors: Object.values(error.errors).map((el) => el.message),
        });
      }
    });
    


    ユーザーを更新する

    app.put('/users/:id', async (req, res) => {
      try {
        let { firstname, lastname, email } = req.body;
    
        firstname = firstname.toLowerCase().trim();
        lastname = lastname.toLowerCase().trim();
        email = email.toLowerCase().trim();
    
        const id = parseInt(req.params.id, 10);
        if (Number.isNaN(id)) return res.status(400).end();
    
        const isUserExist = await User.findOne({ where: { id } });
    
        if (!isUserExist)
          return res.status(404).json({ status: false, error: 'No User' });
    
        const user = await User.findByPk(id);
    
        user.firstname = firstname ? firstname : user.firstname;
        user.lastname = lastname ? lastname : user.lastname;
        user.email = email ? email : user.email;
    
        const updatedUser = await user.save();
    
        return res.status(200).json({ status: true, data: updatedUser });
      } catch (error) {
        res.status(500).json({
          status: false,
          errors: error,
        });
      }
    });
    


    ユーザーを削除する

    app.delete('/users/:id', async (req, res) => {
      try {
        const id = parseInt(req.params.id, 10);
        if (Number.isNaN(id)) return res.status(400).end();
    
        const isUserExist = await User.findOne({ where: { id } });
    
        if (!isUserExist)
          return res.status(404).json({ status: false, error: 'No User' });
    
        const user = await User.findByPk(id);
    
        await user.destroy();
        return res
          .status(200)
          .json({ status: true, msg: 'User deleted successfully!' });
      } catch (error) {
        console.log(error);
        res.status(500).json({
          status: false,
          errors: error,
        });
      }
    });
    


    結論



    次の Node.js プロジェクトで Sequelize.js を構成する方法を学びました.

    このチュートリアルに従って問題が発生した場合は、 GitHub Repository のコードを自由に確認してください.

    この記事に関するご質問やご意見がございましたら、お気軽にお問い合わせください.

    読んでくれてありがとう.

    クレジット



    Node.js は、Chrome の V8 JavaScript エンジン上に構築された JavaScript ランタイムです: https://nodejs.org/en/

    Express.js、Node.js 用の高速で自由なミニマリスト Web フレームワーク: https://expressjs.com/

    Sequelize、promise ベースの Node.js ORM: https://sequelize.org/