OpenIntegrations icon indicating copy to clipboard operation
OpenIntegrations copied to clipboard

[Ошибка] posgresql NUMERIC поля, "Unsupported type: NUMERIC"

Open Alexvolt opened this issue 3 months ago • 4 comments

Описание ошибки При обращении к базе данных posgresql через метод OPI_PostgreSQL.ВыполнитьЗапросSQL() к полям, у которых тип данных numeric(15,2), возвращается следующее значение «Unsupported type: NUMERIC». Это осознанное поведение, баг или недоработка? Возможно ли добавить поддержку типа?

При преобразование в float (::float - ниже есть пример) возвращает все нормально.

Воспроизведение Создаем проблемную таблицу:

CREATE TABLE public.testnumeric (
	column1 numeric(15, 2) NULL
);

insert into public.testnumeric values(100.22);

select testnumeric.column1 as okField from public.testnumeric as testnumeric

Получаем данные:

	СтрокаПодключения 	= OPI_PostgreSQL.СформироватьСтрокуПодключения(ИмяСервера, ИмяБазы, Логин, Пароль, Порт);
	Соединение         	= OPI_PostgreSQL.ОткрытьСоединение(СтрокаПодключения);
	
	ТекстЗапроса 		= "select testnumeric.column1::float as okField from public.testnumeric as testnumeric";
	ТекстЗапроса 		= "select testnumeric.column1 as okField from public.testnumeric as testnumeric";

    Результат 			= OPI_PostgreSQL.ВыполнитьЗапросSQL(ТекстЗапроса, , , Соединение);
	
	Закрытие 			= OPI_PostgreSQL.ЗакрытьСоединение(Соединение);
	
	ЗапросВыполнен		= Результат.Получить("result");
	Если ЗапросВыполнен = Неопределено Тогда
		ЗапросВыполнен	= Ложь;	
	КонецЕсли;	
	
	ТекстОшибки			= Результат.Получить("error");
	
	Если Не ЗапросВыполнен Тогда
		Сообщить(ТекстОшибки);
	Иначе
		МассивДанных	= Результат.Получить("data");
		КоличествоСтрок	= МассивДанных.Количество();
		Сообщить("Запрос выполнен! (Количество строк: " + КоличествоСтрок + ")");   
		
		Если КоличествоСтрок > 0 Тогда
			Сообщить(МассивДанных[0]["okfield"]);   
		КонецЕсли;
	КонецЕсли;	

В сообщениих выводит:

Запрос выполнен! (Количество строк: 1)
Unsupported type: NUMERIC

Ожидаемое поведение Возвращает 100.22 как и в первом из запросов, где преобразуем в ::float

Платформа и конфигурация 8.3.25.1560

Alexvolt avatar Nov 17 '25 06:11 Alexvolt

Ну, это не то чтобы осознанное поведение библиотеки, скорее реализация пакета на Rust, которая под капотом

Но, думаю, можно расширить попытку приведения нереализованных типов. Подумаю

Bayselonarrend avatar Nov 17 '25 06:11 Bayselonarrend

Любопытно было почитать. Даже всякие извращенные типы, например POINT, реализованы, как опциональные. А главный "денежный" тип нет.

Но кажется подозреваю в чем логика: отсутствие нативной поддержки десятичных типов типа decimal или numeric в самом rust. Помню, что столкнулся с этим года полтора назад, изучая из любопытства rust. А раз нет аналога типа, нужен чей-то кастомный crate и ни о какой универсальности речи быть не может.

Вот реально не понимаю, почему в языках типа go, rust или dart не хотят из коробки поддерживать десятичные типы и вынуждают всех жить на костылях(.

А преобразование в float может иногда дать нехорошие эффекты на неудачных числах((.

Ладно, буду приглядывать за issue, вдруг у Вас что-то надумается)

Alexvolt avatar Nov 17 '25 07:11 Alexvolt

@Alexvolt, почитал issues к крейту postgres - вычитал, что rust_decimal это все поддерживает Докинул DECIMAL | NUMERIC к приведению типов, должно нормально читаться/писаться теперь. Попробуйте обновить макет у себя

OPI_PostgreSQL.zip

Bayselonarrend avatar Nov 17 '25 07:11 Bayselonarrend

Огромная благодарность, попробовали - вроде работает. У нас все корп. OTAP на таких типах.

Alexvolt avatar Nov 19 '25 08:11 Alexvolt

Реализованов в 1.30.0

Bayselonarrend avatar Dec 11 '25 06:12 Bayselonarrend