web-dev-qa-db-ja.com

タイムスタンプで「NOW()」を使用してSequelizeで更新する方法は?

私は次のようなことをしようとしています:

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

明らかに、文字列として渡されるだけなので、機能しません。後でタイムスタンプを別の「ON UPDATE CURRENT_TIMESTAMP」フィールドと比較し、データベースとソースが異なる時間で実行される可能性があるため、ノードで作成されたタイムスタンプを渡さないようにします。

データベースプロシージャを作成して呼び出すだけのオプションはありますか?

17
Blaher

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
25
srlm

NOW()は標準ではなく、SQLサーバーでは機能しないことを(検索でここに来る人に)言及する価値があります。したがって、移植性に関心がある場合は、これを行わないでください。

sequelize.literal('CURRENT_TIMESTAMP')

うまくいくかもしれません

19
user2643726