У меня есть следующие вложенные типы, определенные в Postgres:Преобразование JSON в вложен Postgres составного типа
CREATE TYPE address AS (
name text,
street text,
zip text,
city text,
country text
);
CREATE TYPE customer AS (
customer_number text,
created timestamp WITH TIME ZONE,
default_billing_address address,
default_shipping_address address
);
А теперь хотелось бы, чтобы заполнить эти типы в хранимой процедуре, которая получает JSON в качестве входного параметра. Это работает для полей на верхнем уровне, на выходе показывает мне внутренний формат типа Postgres композитной:
# select json_populate_record(null::customer, '{"customer_number":"12345678"}'::json)::customer;
json_populate_record
----------------------
(12345678,,,)
(1 row)
Однако, Postgres не обрабатывает вложенную структуру JSon:
# select json_populate_record(null::customer, '{"customer_number":"12345678","default_shipping_address":{"name":"","street":"","zip":"12345","city":"Berlin","country":"DE"}}'::json)::customer;
ERROR: malformed record literal: "{"name":"","street":"","zip":"12345","city":"Berlin","country":"DE"}"
DETAIL: Missing left parenthesis.
Что работает снова, если вложенная свойство во внутреннем формате Postgres', как здесь:
# select json_populate_record(null::customer, '{"customer_number":"12345678","default_shipping_address":"(\"\",\"\",12345,Berlin,DE)"}'::json)::customer;
json_populate_record
--------------------------------------------
(12345678,,,"("""","""",12345,Berlin,DE)")
(1 row)
есть ли способ, чтобы получить Postgres для преобразования из вложенной структуры JSon к соответствующему составному типу ?
Хотя я, вероятно, не хочу полагаться на plpython для этой проблемы, этот ответ показывает, что существует общее решение, и что postgres будут иметь всю информацию о типе, необходимую для ее реализации. –