如何在时间戳上使用“NOW()”更新 Sequelize?
Posted
技术标签:
【中文标题】如何在时间戳上使用“NOW()”更新 Sequelize?【英文标题】:How to update with Sequelize with 'NOW()' on a timestamp? 【发布时间】:2015-04-09 11:10:22 【问题描述】:我正在尝试执行以下操作:
model.updateAttributes(syncedAt: 'NOW()');
显然,这不起作用,因为它只是作为字符串传递。我想避免传递节点构造的时间戳,因为稍后我将它与另一个“ON UPDATE CURRENT_TIMESTAMP”字段进行比较,并且数据库和源可能运行不同的时间。
我唯一的选择是只创建一个数据库过程并调用它吗?
【问题讨论】:
new Date().toString()
怎么样
@laggingreflex 我可以只使用 moment().format(),但我想避免以后将数据库时间与客户端生成时间进行比较。
为什么不启用时间戳,所以只要调用 model.update(,where:my_primary_key:value) 就会更新 updatedAt
【参考方案1】:
您可以使用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
【讨论】:
谢谢! sequelize.fn('NOW') 正是我需要的。 sequelize.fn('NOW(6)') 是否支持存储小数秒/微秒?因为如果我们使用 mysql >= 5.6,现在支持 Sequelize.DATE(6) 数据类型 OK:sequelize.fn('NOW', 6) 支持存储小数秒/微秒。 请注意,这会将实例的 syncedAt 属性设置为fn: "NOW", args: []
而不是当前时间戳(因为这是由数据库确定的)。
干得好!谢谢。【参考方案2】:
值得一提(对于通过搜索来到这里的人)NOW() 不是标准的并且不能在 SQL 服务器上工作 - 所以如果您关心可移植性,请不要这样做。
sequelize.literal('CURRENT_TIMESTAMP')
可能会更好
【讨论】:
谢谢,这正是我使用 SQLite3 和 Sequelize 所需要的。【参考方案3】:您可以使用:sequelize.literal('CURRENT_TIMESTAMP')
。
示例:
await PurchaseModel.update( purchase_date : sequelize.literal('CURRENT_TIMESTAMP') , where: id: purchaseId );
【讨论】:
以上是关于如何在时间戳上使用“NOW()”更新 Sequelize?的主要内容,如果未能解决你的问题,请参考以下文章