在Bookshelf for PG中明确设置用户架构

时间:2016-01-08 19:42:37

标签: postgresql connection-string bookshelf.js knex.js

在我们的开发环境中,每个开发人员都有自己的模式来复制stage和prod数据库。需要能够将用户架构作为客户端配置的一部分传递。这是配置......

"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设置用户架构。

1 个答案:

答案 0 :(得分:1)

虽然我无法找到原始问题的答案,但如何设置PG架构,我能够解决手头的问题。原来是PG中的权限问题。确保所有用户在各自的search_path中都有r / w perms并且一切都很好。

我在Bookshelf,Knex或PG客户端的任何地方都找不到任何错误消息,这可能是一个可能的罪魁祸首,所以希望这有助于某些人。