Tworzę interfejs RESTful API z NodeJS, express, express-resource i Sequelize, który jest używany do zarządzania zestawami danych przechowywanymi w bazie danych MySQL.
Próbuję dowiedzieć się, jak poprawnie zaktualizować rekord za pomocą Sequelize.
Tworzę 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
}
})
}
Następnie w kontrolerze zasobów definiuję akcję aktualizacji.
Tutaj chcę móc zaktualizować rekord, w którym identyfikator pasuje do req.params
zmiennej.
Najpierw buduję model, a następnie używam updateAttributes
metody do aktualizacji rekordu.
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')
}
W rzeczywistości nie generuje to zapytania aktualizującego, jak bym się spodziewał.
Zamiast tego wykonywane jest zapytanie wstawiające:
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)
Więc moje pytanie brzmi: Jaki jest właściwy sposób aktualizacji rekordu za pomocą Sequelize ORM?
źródło
.success
na.then
Project.findOne(
?findByPk(req.params.id)
zwrócenie instancji.Od wersji 2.0.0 musisz umieścić swoją klauzulę where we
where
właściwości:Aktualizacja 2016-03-09
Najnowsza wersja faktycznie nie używa
success
ierror
już, ale zamiast tego używathen
-able obietnic.Więc górny kod będzie wyglądał następująco:
Korzystanie z async / await
http://docs.sequelizejs.com/en/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows
źródło
Od sequelize v1.7.0 można teraz wywołać metodę update () na modelu. Dużo czystsze
Na przykład:
źródło
A dla osób szukających odpowiedzi w grudniu 2018 r. Jest to poprawna składnia wykorzystująca obietnice:
źródło
Odpowiedź ze stycznia 2020 r.
Należy zrozumieć, że istnieje metoda aktualizacji modelu i oddzielna metoda aktualizacji wystąpienia (rekordu).
Model.update()
aktualizuje WSZYSTKIE pasujące rekordy i zwraca tablicę, patrz dokumentacja Sequelize .Instance.update()
aktualizuje rekord i zwraca obiekt instancji.Aby zaktualizować pojedynczy rekord na pytanie, kod wyglądałby mniej więcej tak:
Tak więc użyj
Model.findOne()
lub,Model.findByPkId()
aby uzyskać obsługę pojedynczej instancji (rekordu), a następnie użyjInstance.update()
źródło
Myślę, że używanie,
UPDATE ... WHERE
jak wyjaśniono tutaj i tutaj, jest podejściem szczupłymźródło
To rozwiązanie jest przestarzałe
więc musisz użyć
pozdrowienia
źródło
Używanie async i await w nowoczesnym javascript Es6
możesz zwrócić wynik ...
źródło
public static update (wartości: Object, opcje: Object): Promise>
raz sprawdź dokumentację http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update
źródło
Możesz użyć metody Model.update ().
Z async / await:
Z .then (). Catch ():
źródło
cześć, aby zaktualizować rekord, to bardzo proste
result.feild = updatedField
źródło
Jeśli szukasz sposobu na zwiększenie określonej wartości pola w modelu ...
To działało dla mnie od
[email protected]
User.increment("field", {by: 1, where: {id: 1});
ODNIESIENIE: https://github.com/sequelize/sequelize/issues/7268
źródło
Istnieją dwa sposoby aktualizacji rekordu w trybie sequelize.
Po pierwsze, jeśli masz unikalny identyfikator, możesz użyć klauzuli where lub jeśli chcesz zaktualizować wiele rekordów o tym samym identyfikatorze.
Możesz utworzyć cały obiekt do aktualizacji lub określoną kolumnę
Zaktualizuj tylko określoną kolumnę
Po drugie, możesz użyć zapytania wyszukiwania, aby je znaleźć i użyć funkcji set and save, aby zaktualizować bazę danych.
Zawsze używaj transakcji podczas aktualizowania lub tworzenia nowego wiersza. w ten sposób przywróci wszelkie aktualizacje, jeśli wystąpi jakikolwiek błąd lub jeśli wykonasz wiele aktualizacji:
źródło