Как обновить с Sequelize с помощью "NOW ()" на метке времени?

Я пытаюсь сделать что-то вроде следующего:

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

очевидно, что это не работает, потому что он просто передается как строка. Я хочу избежать передачи метки времени, построенной узлом, потому что позже я сравниваю ее с другим полем "ON UPDATE CURRENT_TIMESTAMP", и база данных и источник могут работать в разное время.

является ли мой единственный вариант просто сделать процедуру базы данных и вызвать это?

2 ответов


можно использовать Sequelize.fn чтобы обернуть его правильно:

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

вот полный рабочий пример:

'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);
    });

производит

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

стоит упомянуть (для людей, приходящих сюда через поиск), что NOW () не является стандартным и не работает на SQL server - поэтому не делайте этого, если вы заботитесь о переносимости.

sequelize.literal('CURRENT_TIMESTAMP')

может работать лучше