Почему выбор интервала PostgreSQL с использованием Knex.js возвращает объект JSON или JavaScript, а не строку? - PullRequest
0 голосов
/ 05 января 2019

У меня есть таблица PostgreSQL, в которой есть столбец типа interval, в котором хранится время в формате ISO 8601, т. Е. P1D равняется "1 дню".

Проблема, с которой я столкнулся, заключается в том, что при выборе этих данных из базы данных с использованием Knex.js данные преобразуются из строки P1D в объект JSON {"days":1}, если я выполняю тот же базовый запрос выбора в команде line interface Я получаю строку P1D назад и могу установить стиль вывода SET intervalStyle = iso_8601.

Насколько я могу судить, это происходит с помощью зависимости Knex.js, называемой "node-pg-types", которая, в свою очередь, использует "postgres-interval". В Bookshelf.js вы можете установить процессор данных, а при непосредственном использовании модуля "pg" вы можете установить различные типы поведения, однако совершенно не ясно, как изменить поведение Knex.js в этом отношении, и, тем не менее, Bookshelf. JS может сделать это и построен на Knex.js.

Короче говоря, мой вопрос заключается в том, как заставить Knex.js выводить интервалы в стиле ISO 8601 для столбцов интервалов, а не для объекта JSON?

1 Ответ

0 голосов
/ 05 января 2019

Оказалось, что благодаря моим исследованиям, переходящим с одного модуля на другой, Knex.js действительно использует "node-pg-types" для форматирования столбцов интервала, а в свою очередь использует "postgres-interval", ни Модуль документирует это хорошо вообще.

При просмотре "postgres-interval" было очевидно, что возвращаемые данные были объектом JavaScript, который был закодирован в нечто похожее на JSON, однако, читая документацию по этому модулю, он фактически имеет функции, которые вы можете вызывать для получения данных. в любом формате:

https://github.com/bendrucker/postgres-interval

interval.toPostgres () -> строка Возвращает интервальную строку. Это позволяет передавать объект интервала в подготовленные операторы.

интервал.toISO () -> строка Возвращает строку, соответствующую стандарту ISO 8601.

Таким образом, ответ заключается в добавлении .toISO() к вашему коду.

Я сообщу разработчику, что это конкретное поведение недостаточно хорошо задокументировано, чтобы они могли лучше понять, как Knex.js передает часть работы другим модулям, которые также пропускают работу, однако я написал это Ответ на вопрос сам, поэтому никто не должен тратить бесчисленные часы, пытаясь выяснить это.

...