Saya membuat RESTful API dengan NodeJS, express, express-resource, dan Sequelize yang digunakan untuk mengelola set data yang disimpan dalam database MySQL.
Saya mencoba mencari cara untuk mengupdate record dengan benar menggunakan Sequelize.
Saya membuat model:
module.exports = function (sequelize, DataTypes) {
return sequelize.define('Locale', {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
locale: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
len: 2
}
},
visible: {
type: DataTypes.BOOLEAN,
defaultValue: 1
}
})
}
Kemudian, di pengontrol sumber daya saya, saya menetapkan tindakan pembaruan.
Di sini saya ingin dapat memperbarui catatan di mana id cocok dengan req.params
variabel.
Pertama saya membangun model dan kemudian saya menggunakan updateAttributes
metode untuk memperbarui catatan.
const Sequelize = require('sequelize')
const { dbconfig } = require('../config.js')
// Initialize database connection
const sequelize = new Sequelize(dbconfig.database, dbconfig.username, dbconfig.password)
// Locale model
const Locales = sequelize.import(__dirname + './models/Locale')
// Create schema if necessary
Locales.sync()
/**
* PUT /locale/:id
*/
exports.update = function (req, res) {
if (req.body.name) {
const loc = Locales.build()
loc.updateAttributes({
locale: req.body.name
})
.on('success', id => {
res.json({
success: true
}, 200)
})
.on('failure', error => {
throw new Error(error)
})
}
else
throw new Error('Data not provided')
}
Sekarang, ini tidak benar-benar menghasilkan kueri pembaruan seperti yang saya harapkan.
Sebagai gantinya, kueri sisipkan dijalankan:
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)
Jadi pertanyaan saya adalah: Apa cara yang tepat untuk mengupdate record menggunakan Sequelize ORM?
sumber
.success
ke.then
Project.findOne(
?findByPk(req.params.id)
mengembalikan sebuah instance.Sejak versi 2.0.0 Anda perlu membungkus klausa where Anda di
where
properti:Perbarui 2016-03-09
Versi terbaru sebenarnya tidak menggunakan
success
danerror
lagi melainkan menggunakanthen
janji yang dapat digunakan.Jadi kode atas akan terlihat seperti berikut:
Menggunakan async / await
http://docs.sequelizejs.com/en/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows
sumber
Sejak sequelize v1.7.0 Anda sekarang dapat memanggil metode update () pada model. Jauh lebih bersih
Sebagai contoh:
sumber
Dan untuk orang yang mencari jawaban pada Desember 2018, ini adalah sintaks yang benar menggunakan promise:
sumber
Jawaban Januari 2020
Hal yang perlu dipahami adalah bahwa ada metode pembaruan untuk Model dan metode pembaruan terpisah untuk sebuah Mesin Virtual (catatan).
Model.update()
memperbarui SEMUA rekaman yang cocok dan mengembalikan array, lihat Mengurutkan dokumentasi .Instance.update()
memperbarui catatan dan mengembalikan objek instance.Jadi untuk memperbarui satu catatan per pertanyaan, kodenya akan terlihat seperti ini:
Jadi, gunakan
Model.findOne()
atauModel.findByPkId()
untuk menangani satu Instance (record) dan kemudian gunakanInstance.update()
sumber
Saya pikir menggunakan
UPDATE ... WHERE
seperti yang dijelaskan di sini dan di sini adalah pendekatan leansumber
Solusi ini tidak digunakan lagi
jadi Anda harus menggunakan
Salam
sumber
Menggunakan async dan menunggu di javascript Es6 modern
Anda dapat mengembalikan hasil ...
sumber
pembaruan statis publik (nilai: Objek, opsi: Objek): Janji>
periksa dokumentasi sekali http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update
sumber
Anda bisa menggunakan metode Model.update ().
Dengan async / await:
Dengan .then (). Catch ():
sumber
hai untuk memperbarui catatan itu sangat sederhana
result.feild = updatedField
sumber
Jika Anda di sini mencari cara untuk menambah nilai bidang tertentu dalam model ...
Ini berhasil untuk saya sejak
[email protected]
User.increment("field", {by: 1, where: {id: 1});
REF: https://github.com/sequelize/sequelize/issues/7268
sumber
Ada dua cara Anda dapat memperbarui rekaman secara sekuel.
Pertama, jika Anda memiliki pengenal unik maka Anda dapat menggunakan klausa where atau jika Anda ingin memperbarui beberapa rekaman dengan pengenal yang sama.
Anda dapat membuat seluruh objek untuk diperbarui atau kolom tertentu
Hanya Perbarui kolom tertentu
Kedua, Anda dapat menggunakan find a query untuk menemukannya dan menggunakan fungsi set and save untuk memperbarui DB.
Selalu gunakan transaksi saat memperbarui atau membuat baris baru. dengan cara itu ia akan mengembalikan pembaruan apa pun jika ada kesalahan atau jika Anda melakukan beberapa pembaruan:
sumber