2017-03-08 5 views
0

Sequelizeを使用してCSVファイルからNodejsシステムにデータをインポートしていますが、以前の行が挿入されていないかどうかを確認する際に問題があります。挿入ごとにコミットを続ける

これは私がライン何度でもこの

lines.forEach(line => { 
    let emp = line.employee; 
    importEmployee(emp).then(employee => {console.dir(employee)}); 
}); 

私がいる問題のようにCSVであるとして機能importEmployeeが呼び出されます

exports.insertEmployee = function (employee) { 
    return new Promise((fulfill, reject) => { 
     models.Employee.create(employee) 
     .then(employee => fulfill(employee.dataValues)) 
     .catch(reject); 
    }); 
}; 

exports.importEmployee = function (employee) { 
    return new Promise((fulfill, reject) => { 
     models.Employee.findOne({where: {customID: employee.customID}, raw: true}).then(emp => { 
      if(emp) { 
       fulfill(emp); 
      } 
      else { 
       exports.insertEmployee(employee).then(fulfill); 
      } 
     }); 
    }); 
}; 

を使用しているコードです同じcustomIDを持つユーザーが既に挿入されているかどうかをチェックすると、データベースはまだ挿入をコミットしていないので、常にfalseを返し、同じcustomIDを持つ従業員が重複します。

どうすれば修正できますか?私はトランザクションを使用しようとしましたが、おそらく私は間違っています。それは助けにならないからです。

ありがとうございます!

答えて

1

forEachの一連の非同期操作を実行したかったため、動作しませんでした。このようにして、チェックと挿入を実行する操作が同時に実行されているため、すべてのレコードが挿入されます。このような状況を回避するには、BluebirdモジュールのmapSeries() Promise機能を使用できます。続編に組み込まれているので、追加のパッケージをインストールする必要はありません。

さらに、findOrCreate()という単一の操作でチェックと挿入を実行することができます。これはインスタンスと、このインスタンスが作成されたか単に既存のものとして返されるかを定義するブール値を返します。

それらの両方の機能を組み合わせる場合、あなたの操作は非常に簡単でわかりやすいなり

// here is the function performing findOrCreate 
exports.createEmployee = function(employee) { 
    return models.Employee.findOrCreate({ 
     where: { customID: employee.customID }, 
     defaults: employee 
    }); 
}; 

詳細は何ですか、あなたはinsertEmployeeimportEmployeeに行ったよう、ネストされた約束を作成する必要はありません。 sequelize関数のほとんどはすでに約束を返しているので、単に関数呼び出し自体を返すことができます。

linesを繰り返し処理し、createEmployeeメソッドを呼び出すことができます。 falseは、レコードがすでに存在しているため、インスタンステーブルから返されたことを意味するのに対し

models.sequelize.Promise.mapSeries(lines, (employee) => { 
    return createEmployee(employee); 
}).then(result => { 
    console.log(result); 
    // example output: [ [ Instance, true ], [ Instance, true ], [ Instance, false ] ] 
}); 
true

ブールは、インスタンスが作成されたことを意味します。

関連する問題