[TIL] Sequelize ORM



今日のスプリントは本当に疲れました.まず,従来の噴霧器のように文書にTODOを表示するのではなく,テスト用例に基づいてどこに何が書かれているかを推定する.ORMのマッピングが何であるかを正しく理解していないまま盲目的に使用する場合は、公式文書のコードをコピーしていますが、何をしているのか分からないのでさらに困難です.しかしやはり小細工(テストデータ手動入力)を使って、まずテストに合格させてもらいましたが、私が書いたものよりも書いた煩わしいコードに近いように見え、理解して書いたとは思えないので疲れました.しかし、スプレッドシートでは、エンジニアがコードの作成過程を説明しながら説明を聞いて理解しました.Modelsのファイルのみを修正した場合、テスト例が合格しなかったので、移行ファイルに触ってみましたが、合格しましたが、これが正しいかどうか疑問です.移行する前にdbにテーブルは存在せず、テーブルを生成するには移行する必要があります.この内容は実は正式なファイルの中にありますが、あまりにも急いでいて、サンプルコードだけを見て、説明を見たことがありません.ブログを書くために、改めてドキュメントを見たところ、Migrationの部分に説明がありました.いつ正式な書類をすばやく正確に読むことができますか...

Today I Learned


ORM


  • Object Relational Mapping

  • 自動マッピングOOPオブジェクトを実装するクラスとRDBのテーブル

  • 利点:クエリー文を熟知する必要がなく、データベースを間接的に操作できます.オブジェクト向けのコードはより直感的です.RDBMSへの依存性を低減する.

  • 欠点:プロジェクトが複雑であればあるほど、設計が困難になり、不適切な実施は速度の低下や一貫性の崩壊を招く.
  • Sequelize


  • Promiseベースのノード.js ORM

  • Postgres、MySQL、MariaDB、SQLite、Microsoft SQLをサポート
  • 1.Seqleizeの設定

  • sequelizeの設定
  • npm install --save sequelize
  • sequelize-cli取付
  • 移行(既存dbの状態変更)を支援するツール
  • npm install --save-dev sequelize-cli
  • プロジェクトブート:initコマンドを使用して新規プロジェクトを作成
  • npx sequelize-cli init

  • 自動生成configmodelsmigrationsseeders・フォルダ
  • config/config.jsonに接続するデータベースやユーザー名、パスワードなどを設定できます.

  • 使用するDBは直接生成する必要があります.(MySQLラーメンcreate database db_name;)
  • 2.モデルの作成


  • CLIを使用してモデルを作成できます.

  • モデルはデータベース内のテーブルの抽象モデルであり、Sequeizeでは継承Modelのクラスを指す.

  • モデル名は単数で作成されますが、テーブル名は自動的に複数に変更されます.
  • Userという名前のモデルを作成
  • name:テーブル名
  • attributes:表欄
  • npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
  • user.jsmodelsフォルダに作成
  • // models/user.js
    'use strict';
    const { Model } = require('sequelize');
    module.exports = (sequelize, DataTypes) => {
      class user extends Model {
        static associate(models) {
          // define association here
        }
      };
      user.init({
        firstName: DataTypes.STRING,
        lastName: DataTypes.STRING,
        email: DataTypes.STRING
      }, {
        sequelize,
        modelName: 'user',
      });
      return user;
    };
  • migrationsフォルダに新しい移行ファイルを作成
  • 'use strict';
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable('users', {
          id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
          },
          firstName: {
            type: Sequelize.STRING
          },
          lastName: {
            type: Sequelize.STRING
          },
          email: {
            type: Sequelize.STRING
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
          }
        });
      },
      down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable('users');
      }
    };

  • モデルファイルのみを変更しても、実際のデータベースには変更は反映されません.移行ファイルも一緒に変更します.

  • 空の移行ファイルに直接変更を作成できます.
  • npx sequelize-cli migration:generate --name migration-name
    // migration skeletion
    module.exports = {
      up: (queryInterface, Sequelize) => {
        // logic for transforming into the new state
      },
      down: (queryInterface, Sequelize) => {
        // logic for reverting the changes
      }
    }
    // up, down returns a Promise
  • DBで実際にテーブルを作成
  • db:migrateデータベースでテーブルを生成するには、コマンドを使用します.
  • npx sequelize-cli db:migrate
  • 移転取消し
  • 移行はgitのcommitと似ている.移行は、モードの変更を記録し、以前の状態に戻ることができます.
  • npx sequelize-cli db:migrate:undo
  • db:migrate:undoクマンドは最寄りの移行状態に戻る