Вставка временной метки с микросекундами в PostgreSQL с использованием Waterlinejs

#node.js #postgresql #timestamp #waterline #sails-postgresql

#node.js #postgresql #временная метка #ватерлиния #паруса-postgresql

Вопрос:

Я пытаюсь сохранить временную метку с точностью до микросекунд, подобной этой:

 2016-10-18T13:36:38.431555
  

Я тестировал только PostgreSQL, и он работает нормально:

 CREATE TABLE test(mytime timestamptz);
INSERT INTO test('2016-10-18T13:36:38.431555');
SELECT * FROM test;
  

выбор возвращает правильную точность:

 2016-10-18T13:36:38.431555
  

Затем я протестировал с помощью nodejs и соединителя pg, используя те же SQL-запросы.

Передача временной метки в виде строки работает, но если я хочу передать объект Date, я теряю точность в микросекундах. Это ограничение JavaScript, поскольку объект Date имеет максимальное разрешение в миллисекундах. Чтобы обойти это, я преобразовал временную метку в bigint с помощью этой функции:

 function convertToUnixTS(timestamp) {
    return new Date(timestamp).getTime() * 1000   parseInt(timestamp.substr(timestamp.length - 3));
}
  

bigint прозрачен для postgres, и запрос select возвращает правильную временную метку

 2016-10-18T13:36:38.431555
  

Теперь для Waterline я создал коллекцию с помощью адаптера postgres и определил свою временную метку как datetime

 Persistence.prototype.collections.Value = Waterline.Collection.extend({
    identity: 'value',
    connection: 'default',
    attributes: {
        mytimestamptz: {
            type: 'datetime',
            required: true
        },
        myvalue: {
            type: 'float',
            required: true
        }
    }
});
  

Это сохранит мои временные метки с разрешением до секунд, на ватерлинии github предлагаются возможные исправления для поддержки миллисекунд (которые я протестировал, и они работают), но мне все еще не хватает 3 дополнительных цифр для точности в микросекунду. Как я продемонстрировал, единственный способ в JavaScript справиться с этим — преобразовать его в bigint . Передача bigint в мою текущую модель вызовет исключение, поэтому я попытался изменить свою модель следующим образом

 mytimestamptz: {
    type: 'integer',
    size: 64,
    required: true
}
  

и

 mytimestamptz: {
    type: 'bigint',
    required: true
}
  

но теперь платформа waterline выдает ошибку недопустимого атрибута.

 (node:12964) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): [Error (E_VALIDATION) 1 attribute is invalid] Invalid attributes sent to event:
 • di_timestamptz
   • [object Object]
  

в то время как в виде строки я вижу:

 1477488110007650
  

Кроме того, я бы действительно предпочел иметь ее в качестве временной метки.

Возможно ли это?

Спасибо

Комментарии:

1. «Передача bigint в мою текущую модель вызовет исключение» Не могли бы вы опубликовать исключение?

2. обновлен вопрос с исключением

3. Тоже ищу ответ на этот вопрос.