Impossible de récupérer la valeur précédente lors de la mise à jour
Je viens de commencer à convertir mon projet de MongoDB vers PostgreSQL en utilisant sequelize
et sequelize-typescript
et j'ai rencontré un problème:
J'ai créé avec MongoDB une méthode upsert qui utilise simplement findOneAndUpdate
. Il trouve un seul utilisateur par son userId, si aucun n'est trouvé, il en crée un sinon il le met à jour avec un objet. Le retour value
est l'enregistrement avant d'être mis à jour. Facile non?
upsert: async (userId: string, obj: Partial<UserModel>) => {
const { value } = await this._users.findOneAndUpdate(
{ _id: userId },
{ $set: obj },
{ upsert: true }
);
return value!;
},
Maintenant, quand je veux utiliser sequelize
, je dois d'abord utiliser findByPk
(qui est l'userId) car findOrCreate
c'est assez lent (mon application s'est déjà plantée plusieurs fois à cause du délai d'attente), puis si un enregistrement est trouvé, je le mets à jour avec un objet sinon j'utilise <Model>.create
. Le fait est que <Model>.update
ne renvoie pas la valeur précédente, .previous()
renvoie des parenthèses vides.
Voici la méthode avec laquelle je travaille actuellement:
upsert: async (userId: string, obj: Partial<User>): Promise<User | null> => {
const user = await User.findByPk(userId);
if (user) {
console.log(1, user);
if (user.login!== obj.login) {
const test = await user.update(obj);
console.log(2, test);
console.log(3, test.previous());
}
return user;
}
return await User.create(obj)
.catch(() => null)
.finally(() => null);
},
Voici la sortie de la console :
Est-ce que je manque un point clé ici? Ou n'est-ce même pas possible? Je fouille dans les docs et globalement sur Google et je n'ai rien trouvé à ce sujet
Solution du problème
Il n'y a aucun moyen d'obtenir les valeurs précédentes à partir de update
. Vous devez stocker user
des accessoires quelque part avant d'appelerupdate
:
const oldUser = user.get({ plain: true });
if (user.login!== obj.login) {
const test = await user.update(obj);
console.log(2, test);
console.log(3, oldUser);
}
Quant à previous()
lui, il renvoie les valeurs d'origine ou précédemment enregistrées avant tout set
appel et jusqu'à ce save
qu'il soit appelé.
Commentaires
Enregistrer un commentaire