ydb-nodejs-sdk icon indicating copy to clipboard operation
ydb-nodejs-sdk copied to clipboard

Способ получить результат в виде json объекта

Open vladkolotvin opened this issue 3 years ago • 5 comments

Сейчас запрос в базу возвращается в IValue. Есть ли способ получить ответ в виде json представления?

column1 | column2 | column3
value1  | value2  | value3

{
  "column1": "value1",
  "column2": "value2",
  "column3": "value3"
}

vladkolotvin avatar May 04 '22 17:05 vladkolotvin

TypedData.createNativeObjects делает то, что нужно.

vladkolotvin avatar May 04 '22 17:05 vladkolotvin

Всё таки этот метод не очень подходит. JsonDocument остаётся строкой. А Interval превращается в страшный {"low":-790388736,"high":140,"unsigned":false}.

Как преобразовать Interval в нормальный тип? Подойдёт ISO 8601

vladkolotvin avatar May 04 '22 18:05 vladkolotvin

.toNumber() помог

vladkolotvin avatar May 04 '22 18:05 vladkolotvin

В конечном итоге код выглядит так себе: const durationMcs = typeof offer.duration === 'number' ? offer.duration : offer.duration.toNumber() Может имеет смысл всё же возвращать Interval строкой в формате ISO 8601?

vladkolotvin avatar May 15 '22 17:05 vladkolotvin

@vladkolotvin Interval в ydb находится в формате Signed 64-bit integer, как указано в документации, а для репрезентации такого числа используется библиотека long, как раз таки {"low":-790388736,"high":140,"unsigned":false} - это представление числа в формате библиотеки long.

Возможно, необходимо перейти на нативный для node.js BigInt, но это поломает обратную совместимость для тех, кто уже использует возможности библиотеки long. К тому же, эта библиотека используется не только для Interval, но и для Decimal, uint64, int64, uuid.

Если же мы действительно хотим использовать ISO8601, то это возможно, но тогда для тех применений, где необходимо число, нужно будет производить дополнительные вычисления (также нужно будет производить дополнительные вычисления при парсинге). А если нужно получить в формате ISO8601, то это можно сделать так: select CAST(Interval("P1DT2H3M4.567890S") AS Text).

Так или иначе, можно обсудить возможные конкретные изменения в API.

zeruk avatar Mar 21 '23 13:03 zeruk