9

このコードはどのように最適化できますか? where を 2 回呼び出したくありません...これよりも優れたクエリを作成することは可能ですか?

    return self.db.clientDevices.where(device).then(function (rows) {
        if (rows.length != 1) {
            device.key = value;
            self.db.clientDevices.insert(device).then();
        } else {
            self.db.clientDevices.where(device).update(device).then();
        }
    });
4

5 に答える 5

6

いつ追加されたかは不明ですが、knex にはhttp://knexjs.org/#Builder-mergeonConflictというメソッドがあります。この方法で「upsert」関数を作成しましたが、mysql で問題なく動作するようです。

module.exports = (table, idKey, data) => require('../knex')(table)
  .insert(data)
  .onConflict(idKey)
  .merge()
  .catch( err => {
    console.error(`There was an error upserting the "${table}" table by ${idKey}:`, err)
    throw err
  })
于 2021-01-25T15:44:19.927 に答える
3

ON DUPLICATE KEY UPDATEknexは現在これをサポートしていないため、生のSQLで試してください。

参照: https://github.com/tgriesser/knex/issues/701

于 2016-02-25T06:46:49.617 に答える