如何在 Knex.js 中正确设置“updateAt”时间戳



我正在使用Knex.js(0.19.0(和PostgreSQL(11-alpinepg@7.11.0(做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'));

但它也不起作用。

我如何让它工作?请帮忙。

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

knex.schema.createTable('users', (table) => {
  table.timestamps(true, true);
});
timestamps — table.timestamps([useTimestamps], [defaultToNow])

在数据库上添加created_at和updated_at列,并将每个列设置为日期时间类型。当 true 作为第一个参数传递时,将改用时间戳类型。两列都默认为不为 null,并在 true 时使用当前时间戳作为第二个参数传递。请注意,在MySQL上,.timestamps((只有秒精度,为了获得更好的精度,直接使用.datetime或.timestamp方法。

来源:https://knexjs.org/#Schema-timestamps

postgresql不支持

语法CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

使updatedAt在更新列时自动更新的唯一方法是使用触发器。

这可能有效(在 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']);
};

如果有一些语法错误或类似的事情,请告诉我。

根据文档,

table.timestamps(true, true);

添加created_at,也可以单独updated_at。第二个参数为真,指的是现在的日期。

来源:https://knexjs.org/#Schema-timestamps

最新更新