你能用特定的 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;
})
我想在每次迁移前使用一个常量 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;
})