2015-11-18 121 views
1

我想在Sequelize中使用upsert方法,但是我得到的布爾返回值不一致。儘管數據庫中的數據更新,但參數總是爲假。這裏是我的代碼:Sequelize upsert布爾型不起作用

router.post('/deploy', function (req, res) { 
    var data; 
    data = req.body; 

    //Update data in mySQL 
    db.site.upsert({ 
     name: data.name, 
     templateId: data.templateId, 
     siteName: data.siteName, 
     domain: utils.formatDomain(data.domain), 
     mainEmail: data.mainEmail, 
     mainPhone: utils.removePhoneNumberFormat(data.mainPhone), 
     mainExt: '' 
    }, { 
     where: { 
      domain: data.domain 
     }, 
    }).then(function (updatedData) { 
     console.log(updatedData); 
     if (updatedData) { 
      console.log('New data written successfully'); 
      return res.status(200).send('New data written'); 
     } else { 
      console.log('Data did not change from the origin'); 
      return res.status(200).send('Nothing changed'); 
     } 
    }).catch(function (e) { 
     console.log('Deploy Controller Error: s% ', e); 
     return res.status(500).end('unexpected_error'); 
    }); 
}); 

我相信我在這裏做錯了什麼,但任何幫助或反饋將不勝感激。謝謝,我希望你過得愉快。 :)

+0

我試圖把這個的repro(這裏:https://github.com/cfogelberg/sequelize-playground/tree/master/tests/08-mysql-upsert-not-working),但我找到upsert總是返回true。 我已經深入瞭解了這一點,它似乎是因爲rowCount始終爲1(相關來源:https://github.com/sequelize/sequelize/blob/0de404640d4c71e2d1f1259356650dfb586a248b/lib/query-interface.js#L566 )。 這是使用MySQL版本5.5.46,node-mysql版本2.9.0和sequelize 3.13.0。你使用的是什麼版本的DB,node-mysql和sequelize? – cfogelberg

+0

謝謝@cfogelberg。我正在使用節點v4.2.1,MySql v5.6.27和Sequelize v3.3.2。我有什麼類型的選項作爲解決方法?我是Sequelize的新手。再次感謝! – Schnaars

+0

看着這更多恐怕我已經無法repro updatedData ===錯誤與Sequelize 3.3.2,3.13.0或3.14.0。如果反正發佈一些工作會很有幫助,那就讓我知道,我會把它們作爲這個問題的正確答案。 – cfogelberg

回答

2

肯定的事情 - 這裏有三種解決方法,HTH :)

解決方法1:使用兩個Sequelize調用

而不是使用upsert你可以使用findById(或count),然後做一個的取決於第一次調用返回的內容,可以是insertupdate。這不會像一個upsert一樣快,但取決於你的perf的需要,它可以很好。某些代碼:

find_mutate: function find_mutate(id, data) { 
    return models.site.findById(id) 
    .then(function insert_or_update_instance(instance) { 
    if(instance !== null) { 
     return instance.update(data); 
    } 
    else { 
     return models.site.create(data); 
    } 
    }); 
}, 

count_mutate: function upsert_using_count_mutate(id, data) { 
    return models.site.count({ where: { domain: id } }) 
    .then(function insert_or_update_instance(count) { 
    if(count !== 0) { 
     return models.site.update(data, { where: { domain: id } }); 
    } 
    else { 
     return models.site.create(data); 
    } 
    }); 
} 

有關演示此操作的測試腳本,請參閱here

解決方法2:手動構建我沒有隻是鏈接到GitHub的例子包括這樣的原始查詢

,但你也可以建立和執行使用Sequelize.query手動的更新插入查詢。我不會推薦:

這就是說,這裏是MySQL查詢示例:

INSERT INTO `site` (`name`,`domain`,`sq_created_at`,`sq_updated_at`) VALUES ('name1','instance1','2015-11-20 13:24:50','2015-11-20 13:24:50') ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `domain`=VALUES(`domain`), `sq_updated_at`=VALUES(`sq_updated_at`); 

解決方法3:更多調試

在3種解決方法中,找出並修復潛在問題可能是您的最佳舉措。 upsert作爲書面作品*,因此可能是因爲您報告的行爲實際上是由代碼中其他地方的另一個錯誤導致的。

*警告:可能無關:#4885

一些指針的是,可能是多餘的或不是新的給你:

  • node-debug是一個偉大的工具。
  • 記錄的SQL和檢查的rowCount值也可能是有用的

注:的Upsert和where

在你的代碼示例指定where條件。upsert根據對象的主鍵構建自己的Where子句,因此不需要此選項鍵。