Arhn - архитектура программирования

Можем ли мы всегда получать столбец даты в виде строки (varchar) с помощью knex и postgres?

У меня есть столбец в базе данных postgres с типом date. Это такой столбец, как день рождения, который является просто датой и не обязательно должен иметь временную часть.

При извлечении этого столбца с помощью knex результатом является объект даты javascript. Предположительно, он выполняет new Date(row.birthday), и это результат, который отправляется клиенту.

Теперь проблема заключается в том, что значение, которое получает клиент, имеет стандартный формат ISO 8601 с частью времени и расширением Z. Когда клиент пытается создать новый объект Date из этой строки, клиент может иметь ошибочное значение даты в зависимости от того, где находится клиент.

Например:

Date: 2018-06-15
Date sent to client: 2018-06-15T00:00:00Z

Client in +5:00     | Client in -5:00
2018-06-16 05:00:00 | 2018-05-15 10:00:00

Это нормально, если сервер находится в UTC, мы могли бы просто добавить смещение часового пояса клиента и получить исходную дату, но это кажется немного хрупким и ломается во время локальной разработки (которая не в UTC).

Простое решение состоит в том, чтобы просто отправить часть даты в виде строки клиентам. Но для этого потребуется сохранить дату как varchar на сервере, чего мы не хотим делать. Мы потеряем ограничение на форматирование даты и усложним выполнение вычислений на основе дат с помощью SQL.

Мы могли бы преобразовать столбец как varchar при выборе столбца, но нам нужно иметь присутствие духа, чтобы делать это каждый раз, когда эта таблица извлекается. Это также означает, что нам нужно обойти ORM (книжную полку), чтобы работать с этой таблицей.

Есть ли простой способ указать в knex, bookshelf или postgres, что столбец должен храниться как date со всеми сопутствующими ограничениями, но всегда извлекаться как varchar?


Ответы:


1

Драйвер node-postgres — это часть, которая фактически создает объекты Date() из данных, отправленных из столбцов даты (https://node-postgres.com/features/types#date-timestamp-timestamptz)

С помощью postgres вы можете изменять парсеры типов node-pg, как описано здесь https://github.com/brianc/node-pg-types

oid типа даты, который равен 1082, может быть получен с помощью следующего запроса

select typname, oid, typarray from pg_type where typname = 'date' order by oid;

Таким образом, чтобы переопределить тип даты для передачи в виде строки, достаточно сделать это перед настройкой соединения с БД (я полагаю, что это можно сделать, например, в knexfile.js):

var types = require('pg').types;
// override parsing date column to Date()
types.setTypeParser(1082, val => val); 
06.06.2018

2

Для меня это не сработало решение с наибольшим количеством голосов. Для меня это сработало, используя momentjs.

    import * as moment from 'moment';
    types.setTypeParser(1114, str => moment.utc(str).format());
    return knex({
        client: 'pg',
        connection: {
          host : 'localhost',
          user : 'postgres',
          password : '',
          database : 'localDB',
        }
    })

Авторы Oleksii Rudenko https://60devs.com/working-with-postgresql-timestamp-without-timezone-in-node.html

30.06.2019
  • Это связано с тем, что 1114 является идентификатором timestamp, а вопрос относится к типу date. 17.09.2020
  • Всем, кто использует timestamptz, вы можете разобрать, используя: types.setTypeParser(1184, (str) => moment(str).format()); 04.08.2021

  • 3

    Установка typeParser для pg, вероятно, лучший ответ, но вы также можете использовать Processor Plugin от Bookshelf. чтобы изменить внешний вид этого конкретного атрибута date:

    bookshelf.plugin('processor')
    var MyModel = bookshelf.Model.extend({
      tableName: 'stuff',
      processors: {
        date: function(value) {
          /* you can use any other method for getting the date part */
          return value.toLocaleDateString()
        }
      }
    })
    
    06.06.2018
  • Я смог добиться того же эффекта, переопределив метод parse в модели. Но я думаю, что я пойду с настройкой анализатора типов в pg. 06.06.2018

  • 4

    Чтобы получить время в соответствии с местным часовым поясом в строковом формате, мы можем использовать.

      var date =function(value) {
          /* you can use any other method for getting the date part */
            return value.toLocaleDateString()
      }
    

    дата('1990-12-30T18:30:00.000Z'); дата (значение)

    13.11.2018
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..