我一直在试验PostgreSQL和PL/V8,它将V8 JavaScript引擎嵌入到PostgreSQL中.使用这个,我可以查询数据库中的JSON数据,这非常棒.
基本方法如下:
CREATE or REPLACE FUNCTION
json_string(data json, key text) RETURNS TEXT AS $$
var data = JSON.parse(data);
return data[key];
$$ LANGUAGE plv8 IMMUTABLE STRICT;
SELECT id, data FROM things WHERE json_string(data,'name') LIKE 'Z%';
Run Code Online (Sandbox Code Playgroud)
使用,V8我可以将JSON数据解析为JS,然后返回一个字段,我可以将其用作常规的pg查询表达式.
但
在大型数据集上,性能可能是一个问题,因为我需要解析数据的每一行.解析器速度很快,但它肯定是过程中最慢的部分,每次都必须发生.
我试图制定出(到最后得到一个实际的问题)是,如果有一种方法可以缓存或预处理的JSON ......即使存储JSON表中的二进制表示,可以由V8使用自动作为JS对象可能是一个胜利.我已经看过使用替代格式,例如messagepack或protobuf,但我不认为它们在任何情况下都必须与原生JSON解析器一样快.
思想
PG有blob和二进制类型,因此数据可以以二进制形式存储,然后我们只需要一种方法将其编组到V8中.
我正在玩PLV8来为PostgreSQL编写触发器和存储过程.到目前为止,与PLPGSQL相比,我并没有真正看到它的缺点.特别是如果使用JSON,它似乎比PLPGSQL更聪明.如果使用PLV8,是否存在已知的缺点或限制?PLV8可以完全替代PLPGSQL吗?如果有人可以分享他的经验,那就太好了.
安装postgres后,无法创建扩展plv8。
我正在使用:CREATE EXTENSION plv8;
我越来越:
ERROR: could not open extension control file "/usr/local/share/postgresql/extension/plv8.control": No such file or directory
********** Error **********
ERROR: could not open extension control file "/usr/local/share/postgresql/extension/plv8.control": No such file or directory
SQL state: 58P01
Run Code Online (Sandbox Code Playgroud)
版本 postgres:9.6.2 版本 pgAdmin4:1.4
如何安装plv8?
我遇到了从plv8.elog()获取正确输出的问题.刚开始,我在Ubuntu 12.10上使用pgxn安装的PostgreSQL 9.2,plv8 1.4.1.我有一个我正在构建的函数,它包含嵌套的游标循环并使用许多预准备语句.我正在关闭游标并释放准备好的语句.所有这些功能都会生成一个对象数组,这些对象是将插入到许多不同表中的记录.
它正在分解的地方是我使用对象中的数据循环遍历该数组以生成查询字符串.我正处于代码的这一部分的构建阶段,因此在我通常执行查询字符串的时候,我会尝试将其输出到控制台.这就是腐败发生的地方.
当输出它在我的测试中生成的9个查询字符串时,只显示其中的7个.当我进入postgres日志时,我发现在2个缺失的查询字符串的末尾,有一个看起来像钻石的字符,里面有问号.基本上它是一些无法在当前字符集中显示的字符.我已经测试了查询生成器代码的所有部分,但找不到任何原因.我相信plv8.elog()函数或plv8引擎的字符串连接功能由于某种原因而破坏.
我遇到的问题是,如果它是字符串连接功能,我不能信任查询字符串正确执行.我已经通过从函数中删除代码并使用数组中的静态信息来测试代码.在这种情况下,它工作正常,所以我知道这部分代码没有问题.
首先,有没有人见过这个?plv8.elog()的腐败或怪异行为?当您的函数达到一定的大小或复杂度时,数据是否有任何损坏?如果是这样,你能想出一种至少解决它的方法吗?
另外,如果它是plv8.elog()函数,还有另一种方法来获取变量中的值吗?我知道应该有v8调试器功能,但我没有成功实现这一点.如果有人有这方面的工作经验,你能不能帮助我让它工作?谢谢.
在Postgresql中,我想调用第三方库,如moment.js或AWS lambda JS Client,以从DB中调用无服务器功能.我没有看到任何文档或示例如何操作:https: //github.com/plv8/plv8/blob/master/README.md
这是可能的吗?在哪里可以找到如何"导入"或"需要"其他库的示例?
这可能为时过早,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$;
Run Code Online (Sandbox Code Playgroud)
然后,当我使用json运行时:
psql=# select jt('{"member":"test"}'::json);
INFO: type is object
INFO: argument is [object …
Run Code Online (Sandbox Code Playgroud) 我想将 google 的开放位置代码 javascript 实现放入 PostgreSQL(使用plv8 扩展名),并使其可用于从 PostGIS 几何/地理数据类型进行编码/解码。
虽然我成功了,但我无法弄清楚如何只为https://github.com/google/open-location-code/blob/master/js/src/openlocationcode.js文件创建一个函数我最终将该函数的副本放入我需要编码/解码加码的每个函数中。当我试图将它拉出到它自己的函数中时,我可以得到一个包含 javascript 的字符串或一个 [Object],[object] 的字符串,而不是一个可调用的函数。
PostgreSQL 中的 plv8 扩展可以做到这一点吗?
不完整的代码片段示例(完整版在这里):
DROP FUNCTION IF EXISTS olc.encode(float,float,integer);
CREATE OR REPLACE FUNCTION olc.encode(
p_latitude double precision,
p_longitude double precision,
p_code_length integer DEFAULT 10
)
RETURNS text AS
$BODY$
var f = function () {
var OpenLocationCode = {};
/**
* Provides a normal precision code, approximately 14x14 meters.
* @const {number}
*/
OpenLocationCode.CODE_PRECISION_NORMAL = 10;
/**
* Provides …
Run Code Online (Sandbox Code Playgroud) 如果我使用PLV8为PostgreSql编写函数,我可以使用PLV8函数的get/post请求调用url吗?