你能用特定的 SQL 代码包装每个 Knex 迁移吗?

Can you wrap each Knex migration with specific SQL code?

我想在每次迁移前使用一个常量 SET ROLE SQL 命令,但我在文档中没有看到任何可以启用此类功能的内容。

有什么办法吗?

例如,如果 Knex 会定期吐出:

CREATE TABLE Persons (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
);

它会吐出:

SET ROLE 'example_user';
CREATE TABLE Persons (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
);

您可以使用 raw knex 函数来做到这一点,例如,您可以 运行 迁移之前的任何原始函数作为

exports.up = async function (knex) {
    await knex.raw('SELECT 1');
    await knex.raw("SET ROLE 'example_user'");
    await knex.schema.createTable(...)
};

exports.down = function (knex) {
    knex.schema.dropTable(...)
};

这是建立在 Abed 的回答之上,但使用了关键的 afterCreate 函数。此 POC 的工作原理是在每个新连接创建后使用 afterCreate 挂钩 运行 SET ROLE postgres

const knex = require('knex')({
  client: 'pg',
  connection: 'postgres://migration_user:postgres@localhost:5432/postgres',  
  searchPath: ['knex', 'public'],
  pool: {
    afterCreate: function (conn, done) {
      // in this example we use pg driver's connection API
      conn.query('SET role postgres;', function (err) {
        done(err, conn);
      });
    }
  }
});

return knex.migrate.latest()
  .then(function(value) {
    console.log('done')
    return value;
  })