сталкивается с «искаженным массивом литерала» при попытке вставить json в postgres - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь передать объект json из моего кода Python с помощью psycopg2, например, в хранимую процедуру postgres:

{
  "experience": null,
  "phoneNumber": [
    "091184xxx"
  ],
  "location": "tehran"
}

, но возникает эта ошибка:

ОШИБКА: malformed array literal: "phoneNumbers" Detail: значение массива должно начинаться с "{" или информации о размерах.

как я могу исправить эту ошибку?

ОБНОВЛЕНИЕ: здесь хранится мойпроцедура:

CREATE OR REPLACE FUNCTION data(job_req JSONB)
  RETURNS VOID
AS $$
DECLARE

INSERT INTO "JobRequirements" (expertise,"phoneNumbers", "location")
  VALUES (
    job_req ->> 'expertise',
    job_req ->> 'phoneNumbers' :: VARCHAR [],
    job_req ->> 'location'
  );
END;
$$ LANGUAGE 'plpgsql';

и тип столбца "phoneNumbers": varchar(255) []

1 Ответ

0 голосов
/ 11 декабря 2018

Вы должны извлечь элемент массива JSON в виде текста и преобразовать его в массив VARCHAR перед вставкой.

CREATE OR REPLACE FUNCTION data(job_req JSONB)
  RETURNS VOID
AS $$
BEGIN
INSERT INTO "JobRequirements" (expertise,"phoneNumbers", "location")
  SELECT 
    job_req ->> 'expertise' ,
     array_agg(d.phonenumber::VARCHAR ) ,
    job_req ->> 'location' 
    FROM jsonb_array_elements_text(job_req->'phoneNumbers') as d(phonenumber);
END;
$$ LANGUAGE plpgsql;

Демо

...