【发布时间】:2016-04-13 14:18:02
【问题描述】:
在我们的开发环境中,每个开发人员都有自己的架构来复制阶段和产品数据库。需要能够将用户模式作为客户端配置的一部分传递。这是配置...
"client": {
"username": "user_login",
"password": "user_password",
"host": "db_host",
"port": 5432,
"database": "db_name",
"dialect": "pg",
"schema": "user_schema"
}
...这里是实例化...
var Knex = require('knex')({
client: client.dialect,
connection: {
host: client.host,
user: client.username,
password: client.password,
database: client.database,
searchPath: client.schema
});
var Bookshelf = require('bookshelf')(Knex);
检查 Bookshelf 和 Knex 对象时,我无法确定正在使用哪个模式的任何地方。我不得不深入研究 SchemaCompiler_PG.prototype.hasTable 方法,我碰巧在一个查询响应对象的数组中找到它,该对象包含 table_schema 的一个属性,很高兴设置为 public。我尝试将其设置为我的架构,但没有成功。
所以我们为每个用户登录设置默认搜索路径。
ALTER ROLE user_login SET search_path TO 'user_schema'
检查响应对象,table_schema 被设置为我的搜索路径。但是当另一个开发人员试图在她的机器上运行代码时(Node 和 PG 的本地实例),该响应对象被设置为 MY 模式。我们找不到手动设置的方法。
不知道那会是什么黑魔法,但需要知道如何为 Bookshelf/Knex/PG 设置用户架构。
【问题讨论】:
-
请更具体地说明“行为更加奇怪”的含义。 “附加到公共模式”到底是什么意思?连接没有“附加”到模式。 Postgres 中也没有显示“No worky”的错误消息——而且我很确定 Knex 或 Bookshelf 中也没有错误消息(尽管我不知道这些库实际上是做什么的)。 “在另一台开发机器上运行”到底是什么意思?数据库是否在不同的机器上运行?使用该登录名的应用程序是否在另一台机器上运行?
-
为清楚起见已更正。稍后我将在 Knex 中添加一个“No Worky”错误的拉取请求。 (开玩笑的......)
-
这看起来更像是那些库中的问题。当您通过纯 SQL(例如在 psql 或任何其他 SQL 客户端中)查询数据库时,搜索路径是否正常工作?
标签: postgresql connection-string bookshelf.js knex.js