plv8 JavaScript语言扩展能否调用第三方库?

10
在PostgreSQL中,我想要调用第三方库(如moment.js或AWS Lambda JS Client)从数据库内部调用无服务器函数。然而,我没有找到任何相关文档或示例来完成这一操作。请问这是否可行,以及在哪里可以找到“导入”或“要求”其他库的示例?请参阅以下链接:https://github.com/plv8/plv8/blob/master/README.md
3个回答

10

由于plv8语言是可信的,因此无法从文件系统加载任何内容。但是您可以从数据库加载模块。

创建一个包含模块源代码的表,并使用selecteval()来加载它。以下是一个简单的示例以说明这个想法:

create table js_modules (
    name text primary key,
    source text
);

insert into js_modules values
('test', 'function test() { return "this is a test"; }' );

js_modules中在您的函数中加载模块:

create or replace function my_function()
returns text language plv8 as $$
//  load module 'test' from the table js_modules
    var res = plv8.execute("select source from js_modules where name = 'test'");
    eval(res[0].source);
//  now the function test() is defined
    return test();
$$;

select my_function();

CREATE FUNCTION
  my_function   
----------------
 this is a test
(1 row) 

您可以在此文章中找到一个更为详细的例子,其中包含一个优雅的require()函数:《PL/v8深入探究》。它基于plv8.start_proc(此处也有一个简短的例子)。


2
丑陋的解决方案:使用 select sourceeval(),我们失去了 V8 的所有性能...没有办法“预编译”吗? - Peter Krauss
我不认为它很丑。这只是你可以在不干扰plv8扩展源代码的情况下做的一切。 - klin
...唔...没有预编译的方式吗?(在eval之后无法向PostgreSQL用户目录库中注册?) - Peter Krauss
@PeterKrauss - 我忘了,还有初始化函数,请参见使用PostgreSQL plv8扩展创建可重用函数是否可能?中的第二个选项。 - klin
谢谢,这正是我在寻找的。 - Peter Krauss
https://github.com/jerrySievert/plv8-modules 是一个工具,可以更轻松地将代码加载到数据库中(并通过使用 plv8.start_proc 的“require”使其可用)。 - armb

1
我有两个提示指向“NO”的方向:

我有两个提示指向NO方向:

  1. 您可以在 Amazon RDS PosgreSQL 中使用 PLV8。RDS不允许使用任何不被认为是可信任的语言。正如PostgreSQL文档中所解释的:

    可信任

    可信任表示该语言不授予用户不能访问的数据。

    如果PLV8可以使用库,则可能会通过这些库执行一些操作,例如通过HTTP下载数据或检查文件系统,这将违反此限制,并可能将RDS系统置于黑客攻击的风险之下。

  2. PLV8演示 - Lucio Grenzi的PostgreSQL网页端

    幻灯片#10:

    PLV8:一个可信任的语言

      [...]

    • 无法从文件系统加载外部处理模块

一个可能的替代方案

我使用了PLPERLuu表示不受信任的)语言。使用该语言,您可以使用库。您的库应位于PostgreSQL使用的PERL安装的标准位置中(在CREATE LANGUAGE定义时)。


0

相当一段时间后...在AWS RDS PostgreSQL中,可以使用以下版本调用Lambda函数:

  • 14.1及更高的次要版本
  • 13.2及更高的次要版本
  • 12.6及更高的次要版本

使用如下选择语句:

同步

SELECT * FROM aws_lambda.invoke(:'aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json);

异步

SELECT * FROM aws_lambda.invoke(:'aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'Event');

当然,在这里的说明中,设置它还有更多内容: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL-Lambda.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接