Sequelize
- PostgreSQL、MySQL、SQLite、MSSQLといったDBに簡単にアクセスするためのNode.jsのORM
こんな構造のデータを新規に追加する
※現実には部と課が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をリレーションのあるテーブルのデータに含めることができる