gpt4 book ai didi

javascript - Knex.JS 自动更新触发器

转载 作者:可可西里 更新时间:2023-11-01 01:29:49 30 4
gpt4 key购买 nike

我正在使用 Knex.JS迁移工具。但是,在创建表时,我希望有一个名为 updated_at 的列,当数据库中的记录更新时该列会自动更新。

例如,这是一张表:

knex.schema.createTable('table_name', function(table) {
table.increments();
table.string('name');
table.timestamp("created_at").defaultTo(knex.fn.now());
table.timestamp("updated_at").defaultTo(knex.fn.now());
table.timestamp("deleted_at");
})

created_atupdated_at 列默认为记录的创建时间,这很好。但是,当该记录更新时,我希望 updated_at 列显示自动更新的新时间。

我不想用原始的 postgres 编写。

谢谢!

最佳答案

使用 Postgres,你需要一个 trigger .这是我成功使用的一种方法。

添加一个函数

如果您有多个按设置顺序排列的迁移文件,您可能需要人为地更改文件名中的日期戳以使其首先运行(或仅将其添加到您的第一个迁移文件中)。如果无法回滚,则可能需要通过 psql 手动执行此步骤。但是,对于新项目:

const ON_UPDATE_TIMESTAMP_FUNCTION = `
CREATE OR REPLACE FUNCTION on_update_timestamp()
RETURNS trigger AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
`

const DROP_ON_UPDATE_TIMESTAMP_FUNCTION = `DROP FUNCTION on_update_timestamp`

exports.up = knex => knex.raw(ON_UPDATE_TIMESTAMP_FUNCTION)
exports.down = knex => knex.raw(DROP_ON_UPDATE_TIMESTAMP_FUNCTION)

现在该函数应该可用于所有后续迁移。

定义一个knex.raw触发器助手

我发现如果可以避免的话,不在迁移文件中重复大量 SQL 会更有表现力。我在这里使用了 knexfile.js,但如果您不想让它复杂化,您可以在任何地方定义它。

module.exports = {
development: {
// ...
},

production: {
// ...
},

onUpdateTrigger: table => `
CREATE TRIGGER ${table}_updated_at
BEFORE UPDATE ON ${table}
FOR EACH ROW
EXECUTE PROCEDURE on_update_timestamp();
`
}

使用助手

最后,我们可以相当方便地定义自动更新触发器:

const { onUpdateTrigger } = require('../knexfile')

exports.up = knex =>
knex.schema.createTable('posts', t => {
t.increments()
t.string('title')
t.string('body')
t.timestamps(true, true)
})
.then(() => knex.raw(onUpdateTrigger('posts')))

exports.down = knex => knex.schema.dropTable('posts')

请注意,删除表足以摆脱触发器:我们不需要显式的 DROP TRIGGER

这一切看起来工作量很大,但一旦你完成它就非常“一劳永逸”,如果你想避免使用 ORM,它也很方便。

关于javascript - Knex.JS 自动更新触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36728899/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com