web-dev-qa-db-fra.com

Comment mettre à jour avec Sequelize avec 'NOW ()' sur un horodatage?

J'essaie de faire quelque chose comme ceci:

model.updateAttributes({syncedAt: 'NOW()'});

Évidemment, cela ne fonctionne pas car il est simplement passé sous forme de chaîne. Je veux éviter de passer un horodatage construit par nœud, car plus tard je le compare à un autre champ 'ON UPDATE CURRENT_TIMESTAMP' et la base de données et la source peuvent s'exécuter à des heures différentes.

Est-ce que ma seule option est de créer une procédure de base de données et d'appeler cela?

17
Blaher

Vous pouvez utiliser Sequelize.fn pour bien l'envelopper:

instance.updateAttributes({syncedAt: sequelize.fn('NOW')});

Voici un exemple de travail complet:

'use strict';

var Sequelize = require('sequelize');
var sequelize = new Sequelize(/*database*/'test', /*username*/'test', /*password*/'test',
    {Host: 'localhost', dialect: 'postgres'});

var model = sequelize.define('model', {
    syncedAt: {type: Sequelize.DATE}
});

sequelize.sync({force: true})
    .then(function () {
        return model.create({});
    })
    .then(function () {
        return model.find({});
    })
    .then(function(instance){
        return instance.updateAttributes({syncedAt: sequelize.fn('NOW')});
    })
    .then(function () {
        process.exit(0);
    })
    .catch(function(err){
        console.log('Caught error! ' + err);
    });

Cela produit

UPDATE "models" SET "syncedAt"=NOW(),"updatedAt"='2015-02-09 18:05:28.989 +00:00' WHERE "id"=1
25
srlm

Il convient de mentionner (pour les personnes venant ici via la recherche) que NOW () n'est pas standard et ne fonctionne pas sur SQL Server - alors ne le faites pas si vous vous souciez de la portabilité.

sequelize.literal('CURRENT_TIMESTAMP')

peut mieux fonctionner

19
user2643726