【问题标题】:Relation not found error in multi-row insert with postgresql and pg-promise使用 postgresql 和 pg-promise 在多行插入中找不到关系错误
【发布时间】:2019-09-23 21:20:44
【问题描述】:

我正在使用 postgresql-db 开发一个 nodejs 项目。 我已经为带有一些表的数据库创建了一个 schema,现在我已经创建了一个文件,其中包含一些准备好的数据(多行)要插入。为此,我遵循了此条目的说明:Multi-row insert with 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】:

    如果你更加注意查看报告的错误:

    { 错误:关系“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:TableName

    【讨论】:

    • 我现在已经尝试了所有三种可能性,但我总是得到同样的错误。我还记录了表名,它似乎是正确的连接:“tenantx”。“ObjectGroup”。还能有别的原因吗?日志说:***** "tenantx"."ObjectGroup" ----- Data could not be initialized. { error: relation "tenantx.ObjectGroup" does not exist [...]
    • 记录列集的日志说:***** ColumnSet { table: "tenantx"."ObjectGroup" columns: [ Column { name: "objectgroup" } Column { name: "description" } ] } ----- Data could not be initialized. { error: relation "tenantx.Object" does not exist
    • 一个区别是,我的 pgp.helpers.insert(...) 是一个 var 而不是 const 因为 for 循环。会是一个原因吗?
    • 最初是tenantx.ObjectGroup,现在是tenantx.Object。我不知道您在那里真正做了什么,我看不到代码,但是您这边有些不对劲。我给你的解决方案必须完全修复你显示的错误。
    • 这两张桌子我都不止一张。可能我没有按正确的顺序复制日志,对不起。嗯,这很奇怪..
    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2019-11-12
    • 2018-12-09
    • 2017-02-08
    相关资源
    最近更新 更多