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

3
我正在开发一个使用NodejsPostgreSQL-db的项目。 我已经为数据库创建了一个schema和一些表,现在我创建了一个包含预先准备好的数据(多行)的文件以便插入。我根据这篇文章的说明进行操作:Multi-row insert with pg-promise
问题是,我遇到了以下错误:{ error: relation "tenantx.ObjectGroup" does not exist ...但是它确实存在。当我想读取表格内容时,从我的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) \
            )';
1个回答

3

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

{ error: 关系"tenantx.ObjectGroup"不存在 ...

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

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

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

不需要提供模式+表名称,您可以将所有内容都指定为表名,然后进行适当的转义。

正确的指定模式+表的方式有以下几种:

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

或者:

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

或者:

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

请查看API:TableName

我已经尝试了所有三种可能性,但我始终得到相同的错误。我还记录了表名,它似乎是正确连接的:"tenantx"。"ObjectGroup"。还有其他原因吗?日志显示:***** "tenantx"。"ObjectGroup" ----- 数据无法初始化。 { error: 关系“tenantx.ObjectGroup”不存在[...] - Galadriel
带有记录列集的日志显示:***** ColumnSet { table: "tenantx"."ObjectGroup" columns: [ Column { name: "objectgroup" } Column { name: "description" } ] } ----- 数据无法初始化。 { error: 关系“tenantx.Object”不存在 - Galadriel
一个区别是,我的 pgp.helpers.insert(...) 是一个变量而不是常量,因为它在 for 循环中。这可能是一个原因吗? - Galadriel
首先是 tenantx.ObjectGroup,现在是 tenantx.Object。我不知道你到底做了什么,因为我不能看到代码,但你那边似乎出了点问题。我给你的解决方案应该能够恰好修复你展示的错误。 - vitaly-t
这两个都是表格,因为我不止有一个。可能我没有按正确顺序复制日志,对此我很抱歉。嗯,这很奇怪... - Galadriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接