Ich erstelle eine RESTful-API mit NodeJS, Express, Express-Resource und Sequelize, mit der in einer MySQL-Datenbank gespeicherte Datasets verwaltet werden.
Ich versuche herauszufinden, wie ein Datensatz mithilfe von Sequelize ordnungsgemäß aktualisiert werden kann.
Ich erstelle ein Modell:
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
}
})
}
Anschließend definiere ich in meinem Ressourcencontroller eine Aktualisierungsaktion.
Hier möchte ich in der Lage sein, den Datensatz zu aktualisieren, in dem die ID mit einer req.params
Variablen übereinstimmt.
Zuerst erstelle ich ein Modell und verwende dann die updateAttributes
Methode, um den Datensatz zu aktualisieren.
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')
}
Dies führt nicht zu einer Aktualisierungsabfrage, wie ich es erwarten würde.
Stattdessen wird eine Einfügeabfrage ausgeführt:
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)
Meine Frage lautet also: Wie kann ein Datensatz mit Sequelize ORM ordnungsgemäß aktualisiert werden?
quelle
.success
zu.then
Project.findOne(
?findByPk(req.params.id)
dem eine Instanz zurückgegeben wird.Seit Version 2.0.0 müssen Sie Ihre where- Klausel in eine
where
Eigenschaft einschließen:Update 2016-03-09
Die neueste Version verwendet eigentlich nicht mehr
success
underror
verwendet stattdessenthen
-able Versprechen.Der obere Code sieht also wie folgt aus:
Verwenden von async / await
http://docs.sequelizejs.com/de/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows
quelle
Seit der Fortsetzung von Version 1.7.0 können Sie jetzt eine update () -Methode für das Modell aufrufen. Viel sauberer
Beispielsweise:
quelle
Und für Leute, die im Dezember 2018 nach einer Antwort suchen, ist dies die richtige Syntax mit Versprechungen:
quelle
Januar 2020 Antwort
Es ist zu verstehen, dass es eine Aktualisierungsmethode für das Modell und eine separate Aktualisierungsmethode für eine Instanz (Datensatz) gibt.
Model.update()
aktualisiert ALLE übereinstimmenden Datensätze und gibt ein Array zurück ( siehe Dokumentation zu Sequelize) .Instance.update()
aktualisiert den Datensatz und gibt ein Instanzobjekt zurück.Um also einen einzelnen Datensatz pro Frage zu aktualisieren, würde der Code ungefähr so aussehen:
Verwenden Sie also
Model.findOne()
oderModel.findByPkId()
, um eine einzelne Instanz (Datensatz) in den Griff zu bekommen, und verwenden Sie dann dieInstance.update()
quelle
Ich denke,
UPDATE ... WHERE
wie hier und hier erklärt zu verwenden, ist ein schlanker Ansatzquelle
Diese Lösung ist veraltet
also musst du verwenden
Grüße
quelle
Verwenden Sie Async und warten Sie in einem modernen Javascript Es6
Sie können Ergebnis zurückgeben ...
quelle
öffentliches statisches Update (Werte: Objekt, Optionen: Objekt): Versprechen>
Überprüfen Sie die Dokumentation einmal unter http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update
quelle
Sie können die Model.update () -Methode verwenden.
Mit async / warte:
Mit .then (). Catch ():
quelle
Hallo, um den Datensatz zu aktualisieren, ist es sehr einfach
result.feild = updatedField
quelle
Wenn Sie hier nach einer Möglichkeit suchen, einen bestimmten Feldwert in einem Modell zu erhöhen ...
Das hat bei mir ab funktioniert
[email protected]
User.increment("field", {by: 1, where: {id: 1});
REF: https://github.com/sequelize/sequelize/issues/7268
quelle
Es gibt zwei Möglichkeiten, wie Sie den Datensatz nacheinander aktualisieren können.
Wenn Sie einen eindeutigen Bezeichner haben, können Sie zunächst die where-Klausel verwenden oder mehrere Datensätze mit demselben Bezeichner aktualisieren.
Sie können entweder das gesamte zu aktualisierende Objekt oder eine bestimmte Spalte erstellen
Aktualisieren Sie nur eine bestimmte Spalte
Zweitens können Sie eine Abfrage suchen verwenden, um sie zu finden, und die Funktion set and save verwenden, um die Datenbank zu aktualisieren.
Verwenden Sie beim Aktualisieren oder Erstellen einer neuen Zeile immer die Transaktion. Auf diese Weise werden alle Updates zurückgesetzt, wenn ein Fehler auftritt oder wenn Sie mehrere Updates durchführen:
quelle