使用 postgresql 和 pg-promise 进行多行插入时未找到关系错误

问题描述 投票:0回答:1

我正在使用 postgresql-db 开发一个 nodejs 项目。 我已经为带有一些表的数据库创建了一个schema,现在我已经创建了一个文件,其中包含一些要插入的准备好的数据(多行)。为此,我遵循了此条目的说明:使用 pg-promise 进行多行插入

问题是,我收到以下错误:{错误:关系“tenantx.ObjectGroup”不存在...但确实存在。我还可以从我的api中看到,当我想读取表内容时,它返回一个空对象。 “schema.table”声明可能是原因吗?

准备数据的代码如下所示:

    'use strict';
     const pgp = require('pg-promise')({
                // Initialization Options
            });

        const csObjectGroup = new pgp.helpers.ColumnSet(['objectgroup', 'description'], {
                    table: 'tenantx.ObjectGroup'
                });
                // data input values:
                const valuesObjectGroup = [{
                    objectgroup: 'bla',
                    description: 'bla'
                }, {
                    objectgroup: 'blu',
                    description: 'blu'
                }, {
                    objectgroup: 'bla',
                    description: 'bla'
                }];
module.exports = {
    csObjectGroup: csObjectGroup,
    valuesObjectGroup: valuesObjectGroup
}

以及从api调用设置内容的代码: // 将准备好的数据插入表中

function initializeData(pTenantId, dbUri) {
    var dbPostgres = dbUri;
    const datafile = require("./../Data/data_" + pTenantId);

    var statements = [];

    var valuesObjectGroup = datafile.valuesObjectGroup;
    var csObjectGroup = datafile.csObjectGroup;

    statements.push(valuesObjectGroup, csObjectGroup);

    var i, query;
    for (i = 0; i < statements.length - 1; i += 2) {
        query = pgp.helpers.insert(statements[i], statements[i + 1]);
        dbPostgres.none(query)
            .then(data => {
                console.log("+++++ Data successfully initialized.");
            })
            .catch(err => {
                console.log("----- Data could not be initialized.");
                console.log(err);
            });
    }
    return true;
}

我已经创建了表格:

const createObjectGroupTable =
    'CREATE TABLE IF NOT EXISTS tenantx.ObjectGroup \
            ( \
                id serial, \
                objectgroup varchar(50), \
                description varchar(100), \
                PRIMARY KEY (id) \
            )';
javascript node.js postgresql pg-promise
1个回答
3
投票

如果您更仔细地查看报告的错误:

{错误:关系“tenantx.ObjectGroup”不存在...

那不是

"tenantx"."ObjectGroup"
,那只是一个表名
"tenantx.ObjectGroup"

问题源于你声明表的方式:

const csObjectGroup = new pgp.helpers.ColumnSet(['objectgroup', 'description'], {
                    table: 'tenantx.ObjectGroup'
                });

您无需提供架构+表名称,而是将其全部指定为表名称,因此它会相应地转义。

指定 schema + table 的正确方法可以通过以下方式之一完成:

table: {schema: 'tenantx', table: 'ObjectGroup'}

或:

table: new pgp.helpers.TableName('ObjectGroup', 'tenantx')

或:

table: new pgp.helpers.TableName({table: 'ObjectGroup', schema: 'tenantx'})

参见API:表名称

更新

从 v11.7.8 开始,您还可以像这样使用 _TN 帮助器:

const {ColumnSet, _TN} = pgp.helpers;

const csObjectGroup = new ColumnSet(['objectgroup', 'description'], {
                        table: _TN('tenantx.ObjectGroup')
                 });
© www.soinside.com 2019 - 2024. All rights reserved.