我正在用Knex.js(0.19.0
)和PostgreSQL(11-alpine
,[email protected]
)做一个REST教程,我注意到当我发出updatedAt
请求并更新数据时,PUT
列不起作用。
目前这是我的users
表:
// users_migration.js
exports.up = function(knex) {
return knex.schema.createTable('users', function(table) {
table
.increments('id')
.primary()
.unsigned();
table.string('firstName');
table
.string('lastName')
.index()
.notNullable();
table
.string('email')
.unique()
.index()
.notNullable();
table.string('password').notNullable();
table.string('role').defaultTo('STAFF');
table.boolean('isActive').defaultTo(false);
table.timestamp('createdAt').defaultTo(knex.fn.now());
table.timestamp('updatedAt').defaultTo(knex.fn.now());
});
};
我试过这个:
table.timestamp('createdAt').defaultTo(knex.raw('CURRENT_TIMESTAMP'));
table
.timestamp('updatedAt')
.defaultTo(knex.raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
但也不管用。
我该怎么做?请帮忙。
最佳答案
postgresql
不支持语法CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
。
使updatedAt
在列更新时自动更新的唯一方法是使用触发器。
这可能有效(从Update timestamp when row is updated in PostgreSQL复制粘贴):
exports.up = function(knex) {
return knex.schema.createTable('users', function(table) {
...
table.timestamp('updatedAt').defaultTo(knex.fn.now());
})
.raw(`
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW."updatedAt"=now();
RETURN NEW;
END;
$$ language 'plpgsql';
`)
.raw(`
CREATE TRIGGER update_user_updated_at BEFORE UPDATE
ON ?? FOR EACH ROW EXECUTE PROCEDURE
update_updated_at_column();
`, ['users']);
};
如果有语法错误或类似的问题,请告诉我。