Почему Knex неправильно распознает столбцы массива Postgres? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть таблица, которая выглядит примерно так:

create table if not exists gameTemplate00.construction (
    player          uuid                                constraint "[construction] Player foreign key"
                                                            references gameTemplate00.player(id),
    colony          uuid                                constraint "[construction] Colony foreign key"
                                                            references gameTemplate00.colony(id),
    location        text,                               -- All subcolonies at this location contribute to production
    investment      uint8   default 0                   not null,
    cost            uint8                               not null,
    history         uint8[3] default '{null,null,null}' not null,
    priority        uint2,
    allocation      allocation                          not null,
    repeat          boolean default false               not null,
    dispatch        text, -- what to do with the vessel once complete
    project         text,                               -- free form name for player, can be null
    constraint "[construction] Priority must be unique for a given subcolony" 
        unique(colony, location, priority)
);

Когда я запрашиваю ее и получаю результаты от Knex с помощью:

            db('construction')
                .withSchema('gametemplate00')
                .where('colony', payload.colony)
                .where('location', payload.location)
            .then((constructionListResult: any) => {
                ws.send(JSON.stringify(constructionListResult));
                console.log(constructionListResult);
            })

Она возвращает это :

 {
    player: '5f43f33b-dba6-43ca-bc0c-0516e5d29968',
    investment: '0',
    cost: '1000',
    history: '{NULL,NULL,NULL}',
    priority: '4',
    allocation: { kind: 'percent', amount: 0.35 },
    repeat: false,
    dispatch: null,
    project: 'whenever'
  }

Распределение является доменом jsonb, и оно правильно распознает его и создает для него объект json. Но массив разбивается и отображается в виде строки.

Это потому, что у меня что-то неправильно настроено в Knex, или он вообще не распознает postgresql столбцы массива? Это наименее проблематичный пример для меня, но для других это станет настоящей болью, когда придется разбирать их самому.

1 Ответ

1 голос
/ 28 марта 2020

Это как-то связано с массивом пользовательских типов (из расширения pguint postgres). В то время как другие в прошлом имели проблемы с массивами, об этом уже много лет заботятся, и похоже, что он должен работать «из коробки» (для встроенных типов).

A Подобная проблема проливает свет .

Knex уже использует другую библиотеку, называемую pg-types. Если я включу это в свой код, я смогу заставить его обрабатывать целые числа без знака как правильные целые числа:

import * as pg from 'pg';

const newTypes = {
    INT1:     16522,
    UINT1:    16532,
    UINT2:    16542,
    UINT4:    16552,
    UINT8:    16562,
}

// add statements like below for each of the custom types

pg.types.setTypeParser(newTypes.UINT8, (value: string) => {
    return parseInt(value);
});

В базе данных также есть oid для массивов для каждого из пользовательских типов, можно найти примерно так:

SELECT oid, typname FROM pg_catalog.pg_type where typname like '_uint%';

Но мне неясно, как на самом деле разбить их на соответствующие массивы. Я обновлю ответ, если / когда я это выясню.

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