postgresql 如何在Knex.js中正确设置`updatedAt` timestamp?

zi8p0yeb  于 11个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(122)

我正在使用Knex.js(0.19.0)和PostgreSQL(11-alpine[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection))做一个REST教程,我注意到当我发出PUT请求并更新数据时,updatedAt列不起作用。
下面是我的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'));


但也不管用。
我该怎么做?请帮帮忙。

fzwojiic

fzwojiic1#

在定义模式时,可以使用timestamps()方法自动添加created_atupdated_at列。

knex.schema.createTable('users', (table) => {
  table.timestamps(true, true);
});

个字符
在数据库中添加created_at和updated_at列,并将每个列设置为datetime类型。当第一个参数为true时,将使用timestamp类型。当第二个参数为true时,两列默认为非null并使用当前的timestamp。注意,在MySQL中.timestamps()只有秒精度,要获得更好的精度,请直接使用.datetime或.timestamp方法。
来源:https://knexjs.org/guide/schema-builder.html#timestamps

eit6fx6z

eit6fx6z2#

根据文件,

table.timestamps(true, true);

字符串
添加created_at和updated_at。第二个参数为true,表示现在的日期。
来源:https://knexjs.org/#Schema-timestamps

sh7euo9m

sh7euo9m3#

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

};

字符串
请让我知道如果有一些语法错误或类似的东西。

相关问题