Postgresql JSON 动态扩展和增量

Postgresql JSON Dynamic Expand & Increment

大家好,我一直在尝试使用 postgresql 和 python 构建软件。

基本上我想要增量 and/or 动态扩展 json

示例:起初字段为空然后:

#insert (toyota,honda,nissan)

{"toyota":1,
"honda":1,
"nissan":1}

#insert (toyota)

{"toyota":2,
"honda":1,
"nissan":1}

#insert (honda,mitsubitshi)

{"toyota":2,
"honda":2,
"nissan":1,
"mitsubitshi":1}

是的,我知道这可以通过首先通过 python 检索 json 来完成,但我不那样做: 我对 postgresql 过程或触发器功能没有太多经验。

任何帮助将不胜感激::-)

请检查下面的函数。希望它能满足您的要求!

CREATE FUNCTION sp_test(json)
RETURNS VOID AS
$BODY$
DECLARE
    var_sql varchar;
BEGIN 

    IF (EXISTS (
            SELECT json_object_keys()
            EXCEPT
            SELECT column_name FROM information_schema.columns WHERE table_schema = 'your schema' AND table_name = 'test_table'
            )) THEn
        RAISE EXCEPTION 'There is column(s) does not exists on table'; -- Checking structure.
    END IF;

    var_sql := 'Update test_table t SET ' || (SELECT string_agg(CONCAT(t.key, ' = (t.', t.key, ' + ', t.value,')'),', ')  FROM json_each() t);

    EXECUTE (var_sql);

END;
$BODY$
LANGUAGE plpgsql;

规范化的表会更高效,但是 json 解决方案使用这个函数可能会很舒服:

create or replace function add_cars(cars jsonb, variadic car text[])
returns jsonb language plpgsql as $$
declare
    new_car text;
begin
    foreach new_car in array car loop
        cars = cars || jsonb_build_object(new_car, coalesce(cars->>new_car, '0')::int+ 1);
    end loop;
    return cars;
end $$;

DbFiddle.

中查找完整示例