Estou criando uma API RESTful com NodeJS, express, express-resource e Sequelize que é usada para gerenciar conjuntos de dados armazenados em um banco de dados MySQL.
Estou tentando descobrir como atualizar corretamente um registro usando Sequelize.
Eu crio um modelo:
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
}
})
}
Então, em meu controlador de recursos, defino uma ação de atualização.
Aqui eu quero ser capaz de atualizar o registro onde o id corresponde a uma req.params
variável.
Primeiro eu construo um modelo e depois uso o updateAttributes
método para atualizar o registro.
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')
}
Agora, isso não produz realmente uma consulta de atualização como eu esperava.
Em vez disso, uma consulta de inserção é executada:
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)
Portanto, minha pergunta é: Qual é a maneira adequada de atualizar um registro usando Sequelize ORM?
fonte
.success
para.then
Project.findOne(
?findByPk(req.params.id)
retornando uma instância.Desde a versão 2.0.0, você precisa envolver sua cláusula where em uma
where
propriedade:Atualização 09/03/2016
A última versão, na verdade, não usar
success
eerror
mais, mas em vez disso usathen
promessas -Capaz.Portanto, o código superior terá a seguinte aparência:
Usando async / await
http://docs.sequelizejs.com/en/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows
fonte
Desde sequelize v1.7.0 agora você pode chamar um método update () no modelo. Muito mais limpo
Por exemplo:
fonte
E para quem procura uma resposta em dezembro de 2018, esta é a sintaxe correta usando promessas:
fonte
Resposta de janeiro de 2020
A coisa a entender é que há um método de atualização para o Modelo e um método de atualização separado para uma Instância (registro).
Model.update()
atualiza TODOS os registros correspondentes e retorna uma matriz, consulte a documentação do Sequelize .Instance.update()
atualiza o registro e retorna um objeto de instância.Portanto, para atualizar um único registro por pergunta, o código seria mais ou menos assim:
Portanto, use
Model.findOne()
ouModel.findByPkId()
para obter um identificador de uma única instância (registro) e, em seguida, use oInstance.update()
fonte
Acho que usar
UPDATE ... WHERE
como explicado aqui e aqui está uma abordagem enxutafonte
Esta solução está obsoleta
então você tem que usar
Saudações
fonte
Usando async e await em um javascript Es6 moderno
você pode retornar o resultado ...
fonte
atualização estática pública (valores: Objeto, opções: Objeto): Promessa>
verifique a documentação uma vez http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update
fonte
Você pode usar o método Model.update ().
Com async / await:
Com .então (). Catch ():
fonte
oi para atualizar o registro é muito simples
result.feild = updatedField
fonte
Se você está procurando uma maneira de incrementar um valor de campo específico em um modelo ...
Isso funcionou para mim a partir de
[email protected]
User.increment("field", {by: 1, where: {id: 1});
REF: https://github.com/sequelize/sequelize/issues/7268
fonte
Existem duas maneiras de atualizar o registro em sequência.
Em primeiro lugar, se você tiver um identificador exclusivo, poderá usar a cláusula where ou, se desejar, atualizar vários registros com o mesmo identificador.
Você pode criar o objeto inteiro para atualizar ou uma coluna específica
Atualize apenas uma coluna específica
Em segundo lugar, você pode usar localizar uma consulta para localizá-la e usar a função definir e salvar para atualizar o banco de dados.
Sempre use a transação ao atualizar ou criar uma nova linha. dessa forma, ele reverterá todas as atualizações se houver algum erro ou se você fizer várias atualizações:
fonte