如何使用Sequelize更新' NOW()'在时间戳上?

时间:2015-02-09 16:23:15

标签: node.js datetime sql-update sequelize.js

我正在尝试做以下事情:

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

显然,这不起作用,因为它只是作为字符串传递。我想避免传递节点构造的时间戳,因为稍后我将它与另一个'ON UPDATE CURRENT_TIMESTAMP'字段进行比较,数据库和源可能会运行不同的时间。

我唯一的选择就是制作数据库程序并调用它吗?

3 个答案:

答案 0 :(得分:24)

您可以使用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

答案 1 :(得分:19)

值得一提(对于那些通过搜索来到这里的人)NOW()不是标准的,并且不能在SQL服务器上工作 - 所以如果你关心可移植性,不要这样做。

sequelize.literal('CURRENT_TIMESTAMP')

可能效果更好

答案 2 :(得分:1)

您可以使用:sequelize.literal('CURRENT_TIMESTAMP')。 示例:

await PurchaseModel.update( {purchase_date : sequelize.literal('CURRENT_TIMESTAMP') }, { where: {id: purchaseId} } );