LoginSignup
3
2

More than 5 years have passed since last update.

Sequelizeの同期処理をマスターする

Posted at

Sequelize

  • PostgreSQL、MySQL、SQLite、MSSQLといったDBに簡単にアクセスするためのNode.jsのORM

こんな構造のデータを新規に追加する

ER図.PNG

※現実には部と課が1対1ということはありませんが、サンプルコードをシンプルにするたにこのような構造になっております

サンプルコード

Node.js
var bushos = [
  {
    name: "部署名",
    leader: "リーダー名",
    Ka: {
      name: "課名",
      leader: "リーダー名",
      Projects: [
        {
          name: "プロジェクト名",
          leader: "リーダー名"
        },
        {
          ・・・
        },
        {
          ・・・
        }
      ]
    }
  },
  {
    ・・・
  }
];


function saveBushoInfo(bushos){
  var bushoFunctions = [];
  bushos.forEach(function (busho) {
    bushoFunctions.push(new Promise(function (bushoResolve, bushoReject) {
      models.Busho.create({
        name: busho.name,
        leader: busho.color
      }).then(function (savedBusho) {
        models.Ka.create({
          BushoId: savedBusho.id,
          name: savedBusho.Ka.name,
          leader: savedBusho.Ka.leader
        }).then(function (savedKa) {
          var projectFunctions = [];
          busho.Ka.Projects.forEach(function (project) {
            projectFunctions.push(new Promise(function (projectResolve, projectReject) {
              models.Project.create({
                KaId: savedKa.id,
                name: project.name,
                leader: project.leader
              }).then(function () {
                 projectResolve();
              }).catch(function (err) {
                console.log('err', err);
                projectReject();
              });
            }));
          });
          Promise.all(projectFunctions).then(function () {
            bushoResolve();
          }).catch(function (err) {
            console.log('err', err);
            bushoReject();
          });
        }).catch(function (err) {
          console.log('err', err);
          bushoReject();
        });
      }).catch(function (err) {
        console.log('err', err);
        bushoReject();
      });
    }));
  });
  Promise.all(bushoFunctions).then(function () {
    // 正常に保存された
  }, function (err) {
    console.log('err', err);
    // 保存に失敗した
  });
}

説明

  • 配列になっているデータを保存するときは、Sequelizeをただ使うだけでは、非同期の機能がじゃまをする
    • そこでbushoFunctionsのような配列を用意してあげ、そこにDB処理を行うPromiseオブジェクトをプッシュして、Promise.all()を使って、配列の中のすべての処理が終わったら、次の処理に移るようにしてあげる
  • 上のサンプルコードはPromise.all()の入れ子の処理のサンプルになります
  • createメソッドに.thenすることでDBに保存したデータを取得することができ、新規のデータを追加するにあたって採番されたidをリレーションのあるテーブルのデータに含めることができる
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2