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 $$;
中查找完整示例
大家好,我一直在尝试使用 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 $$;
中查找完整示例