5

这可能为时过早,postgres 9.4 仍处于测试阶段。我一直在试验 jsonb 类型。我没有任何运气将 jsonb 类型传递给 plv8 函数,它以字符串类型出现。我想知道我做错了吗?

create or replace function jt ( o json ) returns integer language plv8 immutable
AS $function$
        plv8.elog(INFO, 'type is ', typeof o);
        plv8.elog(INFO, 'argument is ', o);
        plv8.elog(INFO, 'member is ', o['member']);
$function$;

create or replace function jt ( o jsonb ) returns integer language plv8 immutable
AS $function$
        plv8.elog(INFO, 'type is ', typeof o);
        plv8.elog(INFO, 'argument is ', o);
        plv8.elog(INFO, 'member is ', o['member']);
$function$;

然后,当我使用 json 运行时:

psql=# select jt('{"member":"test"}'::json);
INFO:  type is  object
INFO:  argument is  [object Object]
INFO:  member is  test

但是,当我使用 jsonb 运行时:

psql=# select jt('{"member":"test"}'::jsonb);
INFO:  type is  string
INFO:  argument is  {"member": "test"}
INFO:  member is  undefined

-G

4

1 回答 1

5

PL/V8 需要添加对 JSONB 的支持才能按您的预期工作。

与此同时,你仍然可以通过平原json;只是投到jsonbjson

自~2015年以来的新闻

plv8 项目在 2014 年之后发生了变化,正如该项目的赞助商和主要贡献者 JerrySievert在 2017 年的评论:

JSONB 与 JSON 的速度差异已广为人知并得到解决,
JSONB 现在直接将 C++ 转换为 v8 对象,并且比 JSON 转换运行得更快

最后的修订历史显示了一些关于 JSONb 开始日期的线索:

  • 在 2015-05-26(版本 1.4.4)“在函数边界添加 jsonb 类型强制”

  • 在 2019-03-23(版本 2.3.10) “添加直接 jsonb 转换选项”,“为 jsonb 转换添加内存上下文”

建议将 JSONB 与 plv8 版本 2.3.10 或更高版本一起使用……不过,对于旧版本的 plv8, Jarry 确认几乎一切都会好起来的:

自 2015 年 4 月 22 日以来,JSONB 支持一直活跃且完整。

于 2014-08-22T01:24:51.817 回答