Я создаю RESTful API с NodeJS, express, express-resource и Sequelize, который используется для управления наборами данных, хранящимися в базе данных MySQL.
Пытаюсь понять, как правильно обновить запись с помощью Sequelize.
Создаю модель:
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
}
})
}
Затем в своем контроллере ресурсов я определяю действие обновления.
Здесь я хочу иметь возможность обновлять запись, в которой идентификатор соответствует req.params
переменной.
Сначала я создаю модель, а затем использую этот updateAttributes
метод для обновления записи.
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')
}
На самом деле это не вызывает запроса на обновление, как я ожидал.
Вместо этого выполняется запрос на вставку:
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)
Итак, мой вопрос: как правильно обновить запись с помощью Sequelize ORM?
источник
.success
на.then
Project.findOne(
?findByPk(req.params.id)
которая возвращает экземпляр.Начиная с версии 2.0.0, вам нужно заключить предложение where в
where
свойство:Обновление 2016-03-09
Последняя версия фактически не использует
success
anderror
, а вместо этого используетthen
обещания -able.Таким образом, верхний код будет выглядеть следующим образом:
Использование async / await
http://docs.sequelizejs.com/en/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows
источник
Начиная с sequelize v1.7.0 теперь вы можете вызывать метод update () для модели. Намного чище
Например:
источник
И для людей, которые ищут ответ в декабре 2018 года, это правильный синтаксис с использованием обещаний:
источник
Ответ за январь 2020 г.
Необходимо понимать, что существует метод обновления для модели и отдельный метод обновления для экземпляра (записи).
Model.update()
обновляет ВСЕ соответствующие записи и возвращает массив, см. документацию Sequelize .Instance.update()
обновляет запись и возвращает объект-экземпляр.Итак, чтобы обновить одну запись для каждого вопроса, код будет выглядеть примерно так:
Итак, используйте
Model.findOne()
или,Model.findByPkId()
чтобы получить дескриптор одного экземпляра (записи), а затем используйтеInstance.update()
источник
Я думаю, используя,
UPDATE ... WHERE
как описано здесь, и вот бережливый подходисточник
Это решение устарело
так что вы должны использовать
С уважением
источник
Использование async и await в современном javascript Es6
вы можете вернуть результат ...
источник
общедоступное статическое обновление (значения: Объект, параметры: Объект): Обещание>
проверьте документацию один раз http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update
источник
Вы можете использовать метод Model.update ().
С помощью async / await:
С .then (). Catch ():
источник
привет обновить запись это очень просто
result.feild = updatedField
источник
Если вы здесь ищете способ увеличить значение определенного поля в модели ...
Это сработало для меня с
sequelize@5.21.3
User.increment("field", {by: 1, where: {id: 1});
ССЫЛКА: https://github.com/sequelize/sequelize/issues/7268
источник
Есть два способа обновить запись в сиквелизе.
Во-первых, если у вас есть уникальный идентификатор, вы можете использовать предложение where или иначе, если вы хотите обновить несколько записей с одним и тем же идентификатором.
Вы можете создать весь объект для обновления или определенный столбец
Обновлять только определенный столбец
Во-вторых, вы можете использовать поисковый запрос, чтобы найти его, и использовать функцию установки и сохранения для обновления БД.
Всегда используйте транзакцию при обновлении или создании новой строки. таким образом он откатит все обновления, если есть какая-либо ошибка или если вы выполняете несколько обновлений:
источник