powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Q: Golang драйвер не поддерживает array of types. Как быть?
4 сообщений из 4, страница 1 из 1
Q: Golang драйвер не поддерживает array of types. Как быть?
    #39054908
Здравствуйте!

Исходные данные
Версия 9.4.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TYPE item AS (
 a    TIMESTAMP WITHOUT TIME ZONE,
 b    bigint,
 c    bigint,
 d    bigint,
 e    numeric(20,6),
 f    smallint,
 j    smallint
);

CREATE TABLE item_rows (
  id       BIGINT NOT NULL,
  x 	   BIGINT NOT NULL,
  y        BIGINT NOT NULL,
  z 	   BIGINT,
  items    item[],
)
with (fillfactor=90, OIDS=false);



Пишу утилиту на языке Go (golang), которая считывает записи из таблицы.
Код: plsql
1.
select id, items from item_rows


Гоушный драйвер для Go пока не очень продвинутый, в частности не может нормально смаппить при чтении array of type в соответствующий массив Go. Поэтому если поле items считывается в массив структур item_arr

Код: golang
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type item struct  {
 A    time.Time
 B    int64
 C    int64
 D    int64
 E    float64
 F    int16 
 J    int16
}

item_arr := []item{}

фетч записи падает с ошибкой.
Океееей. Делаю так
Код: plsql
1.
select id, items::varchar from item_rows


и поле items считываю в строковую переменную. Работает. Правда нужно распарсить эту строку.

Пробую другой ваирант
Код: plsql
1.
select id, items from item_rows


и поле items считываю в переменную массив байт. Работает. Вот к примеру массив из трех элементов (коды байтов)
7b22285c22323031342d31302d31362030303a30303a30305c222c332c312c31312c32362e3936373332372c33302c383229222c22285c22323 031342d31302d31362030303a31353a30305c222c322c322c36352c38322e3533363430352c32312c343029222c22285c22323031342d31302d 31362030303a33303a30305c222c322c322c38352c31372e3831343530352c39392c363629227d

Массив байт нужно распарсить.
Вопрос: Куда смотреть? Что искать? Где читать о форме передачи array of types на клиента?

Спасибо
...
Рейтинг: 0 / 0
Q: Golang драйвер не поддерживает array of types. Как быть?
    #39055097
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поролоновый слон,

Вариант - unnest. Соответственно, отдельный запрос на каждую строку item_rows или размножение данных мастера на строки детализации (для 9.4 есть lateral).
Впрочем, для реляционной субд логично строки в таблицах, а не в массивах. Так что так или иначе...
...
Рейтинг: 0 / 0
Q: Golang драйвер не поддерживает array of types. Как быть?
    #39055126
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поролоновый слон,

to_json() не пробовали?
...
Рейтинг: 0 / 0
Q: Golang драйвер не поддерживает array of types. Как быть?
    #39056887
@p2.,
да, пробовал через unnest - работает, но на каждую запись два запроса :( как то лишка.
согласен с реляционной моделью, но у нас тут несколько млрд записей и постоянный прирост. Ищем варианты. В реляционной модели у нас все сейчас все лежит в Oracle, но не очень довольны стоимостью дальнейшего расширения.

@Lonepsycho,
пробовал - работает, по идее аналогично ::varchar, хотя безусловно json парсить проще.

По поводу вставки сделал функцию
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE FUNCTION decode_items(text[]) RETURNS  item[] AS $$
DECLARE
  arr item[];
  s text;
  i int;
BEGIN
  i := 0;
  foreach s in array $1 loop
    arr[i] := s::item;
    i := i + 1;
   end loop;
  return arr;
END;
$$ Language plpgsql immutable;



а в коде на Go вставляю с вызовом
Код: plsql
1.
insert into item_rows (items) values ( decode_items(string_to_array($1,'~~^~~')));


где $1 к примеру = '("2014-09-01",1,2,3,44.55,6,7)~^~("2014-09-01",1,2,3,44.55,6,70)'

То есть workarround работает, теперь хочется понять как кодировать/декодировать в исходном двоичном формате, может получится помочь доработать драйвер.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Q: Golang драйвер не поддерживает array of types. Как быть?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]