Ошибка связи не найдена в многорядной вставке с postgresql и pg-promise - PullRequest
1 голос
/ 06 мая 2019

Я разрабатываю проект nodejs с postgresql-db .Я создал схему для БД с некоторыми таблицами, и теперь я создал файл с некоторыми подготовленными данными (несколько строк) для вставки.Для этого я следовал инструкциям этой записи: Многострочная вставка с pg-обещанием .

Проблема в том, что я получаю следующую ошибку: {error: ratio "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) \
            )';

1 Ответ

1 голос
/ 06 мая 2019

Если вы посмотрите на сообщение об ошибке с большим вниманием:

{ошибка: отношение "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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...