Sequelize ORM


ORMとは?


画像ソース:codestates urclass
ORMはオブジェクト関係マッピングの略で、JavaScriptのオブジェクトとリレーショナル・データベース間(オブジェクトとモデル間)の翻訳を担当します.オブジェクト向けプログラミング(OOP)では、リレーショナル・データベースとは少し異なり、プログラミング言語の観点から調整できるのがORMです.ORMでSQL文のJavaScriptコードを自動的に生成できるので、自分でSQL文を書く必要がなくデータベースにアクセスできます.

Sequelize


SequeizeはPromiseベースのノードです.js用のORMは、MySQL、MariaDB、Microsoft SQL Serverなど、さまざまなRDBMSをサポートしています.SQL文は、RDBMSごとに出力される場合が少し異なりますが、Sequelizeはそれらを調整します(互換性↑).これにより、複数のRDBMSを使用できます.
// Sequelize ORM을 사용한 예시 코드
var Sequelize = require('sequelize');
var db = new Sequelize('chatter', 'root', '');

var User = db.define('User', {
  username: Sequelize.STRING
});

var Message = db.define('Message', {
  userid: Sequelize.INTEGER,
  text: Sequelize.STRING,
  roomname: Sequelize.STRING
}); 
// db.define은 스키마 작성 부분. 
// STRING, INTEGER 등은 RDBMS 간 다양한 field타입의 호환성을 유지시켜주기 위해 Sequelize에서 만든 데이터 타입.
// User, Message 등을 Class처럼 사용할 수 있게 해줌.
// id, CreatedAt, UpdatedAt은 자동으로 생성해줌.

User.sync()
  .then(function() {
    return User.create({username: 'Jean Valjean'});
  }) // 데이터 생성, 해당 값은 객체로 입력. INSERT INTO ~~ VALUES구문과 동일.
  .then(function() {
    return User.findAll({ where: {username: 'Jean Valjean'} });
  }) // 데이터 조회. SELECT * FROM ~~ WHERE구문과 동일.
  .then(function(users) {
    users.forEach(function(user) {
      console.log(user.username + ' exists');
    });
    db.close();
  })
  .catch(function(err) {
    console.error(err);
    db.close();
  });

ORM設定


まずSequelize CLIをインストールします.sequelize-cliは、CLIでモデルまたはアプリケーション・モードを作成できる移行を支援するツールです.
npm install --save-dev sequelize-cli
プロジェクトの初期フェーズの自動設定を支援するcliでORMを起動します.
npx sequelize-cli init
正常なブートが完了すると、次のファイルとフォルダが作成されます.
config/config.json // DB 연결 정보 등을 저장
models/ // DB 모델 정의를 저장
migrations/ //마이그레이션에 필요한 데이터가 자동으로 저장됨
seeders/ //테스트에 필요한 데이터를 정의
次に、以下に示すように作成したconfig/configです.jsonファイルを使用してデータベース接続を設定する必要があります.ここで注意すべき特徴は、開発、テスト、生産などの開発環境に応じて、異なるデータベースを使用できることです.
{
  "development": { // 개발 환경
    "username": "root", // DB 사용자 이름
    "password": "your_password", // DB 비밀번호
    "database": "database_development", // 사용할 DB
    "host": "127.0.0.1", // DB 주소
    "dialect": "mysql" // DBMS
  },
  "test": { // 테스트 환경
    "username": "root",
    "password": "your_password",
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": { // 운용 환경
    "username": "root",
    "password": "your_password",
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}
開発、テスト、生産などのオブジェクトの鍵は「model/index」です.js"ファイルで環境変数(process.env.NODE ENV)を一致させるために使用します.環境変数が個別に定義されていない場合は、デフォルトは開発です.
const env = process.env.NODE_ENV || 'development';
データベースがまだ作成されていない場合は、npx sequelize db:createコマンドを実行できます.

モデルの作成


「モデル」(Model)は、エンティティをオブジェクトとして表し、データ構造を記述し、データに対して実行可能なコマンドの集合である.CLIでモデルを作成できます.nameにモデルの名前を入力し、attributesにモデルに作成するフィールドを入力します.id、createdAt、updatedAtフィールドが自動的に生成されます.モデル作成エラーの場合は、作成したファイルを直接変更または削除し、コマンドを再実行できます.
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
上記のコマンドを実行すると、modelsフォルダにuserというモデルファイルが作成され、migrationsフォルダに「XXXXXXXXXXXXX-create-user」が作成されます.js形式の移行ファイルを生成します.

Migration


移行とは、モードの変更に伴ってデータが移行することを意味します.したがって、アーキテクチャが変更されるたびに移行を実行する必要があります.
モデルを作成するまで、データはデータベースに挿入されませんでした.つまり、モデルファイルと移行ファイルのみが作成されます.次のコマンドを実行して移行すると、移行ファイルのアーキテクチャに基づいてデータベースにテーブルが作成されます.テーブル名が設定されていない場合、Sequeizeはモデル名の複数の形で自動的にテーブル名を作成します.モデル名がUserの場合、テーブル名はUsersです.
npx sequelize-cli db:migrate
最近実行した移行にリカバリする場合は、次のコマンドを実行します.
npx sequelize-cli db:migrate:undo
移行ファイルのフォーマットは次のとおりです.
module.exports = {
  up: (queryInterface, Sequelize) => {
    // logic for transforming into the new state
  },
  down: (queryInterface, Sequelize) => {
    // logic for reverting the changes
  }
}
ここで、npx sequelize-cli db:migrateコマンドを上へ実行する場合、npx sequelize-cli db:migrate:undoコマンドを下へ実行する場合、コードを記述して必要な値を得るだけです.

Migration Skeleton


フィールドの変更のみを担当する移行ファイルを直接作成できます.次のコマンドを実行すると、移行フォルダに「xxx-migration-stokeline」と表示されます.js形式のファイルが生成されます.
npx sequelize-cli migration:generate --name migration-skeleton
渡されたqueryInterfaceオブジェクトを使用してデータベースを変更できますが、up関数とdown関数はPromiseに戻る必要があります.
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Person', {
      name: Sequelize.DataTypes.STRING,
      isBetaMember: {
        type: Sequelize.DataTypes.BOOLEAN,
        defaultValue: false,
        allowNull: false
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Person');
  }
};

Association


関連付けとは、「関連付け」の意味でモデル間の関係を定義することです.Sequelizeには、HasOne、BeangStor、HasMany、BeangStorManyの4種類の関連付けがあります.

1:1関係


FooとBarの2つのモデル間で1:1の関係を確立するには、次のような操作を実行する必要があります.
Foo.hasOne(Bar);
Bar.belongsTo(Foo);

1:N関係


TeamとPlayerの2つのモデル間で1:Nの関係を確立するには、次のようにします.
Team.hasMany(Player);
Player.belongsTo(Team);

N:N関係


N:N関係は以下の通り:
const Movie = sequelize.define('Movie', { name: DataTypes.STRING });
const Actor = sequelize.define('Actor', { name: DataTypes.STRING });
Movie.belongsToMany(Actor, { through: 'ActorMovies' });
Actor.belongsToMany(Movie, { through: 'ActorMovies' });