在PostgreSQL中,我想要调用第三方库(如moment.js或AWS Lambda JS Client)从数据库内部调用无服务器函数。然而,我没有找到任何相关文档或示例来完成这一操作。请问这是否可行,以及在哪里可以找到“导入”或“要求”其他库的示例?请参阅以下链接:https://github.com/plv8/plv8/blob/master/README.md。
由于plv8语言是可信的,因此无法从文件系统加载任何内容。但是您可以从数据库加载模块。
创建一个包含模块源代码的表,并使用select
和eval()
来加载它。以下是一个简单的示例以说明这个想法:
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
(此处也有一个简短的例子)。
我有两个提示指向NO方向:
您可以在 Amazon RDS PosgreSQL 中使用 PLV8
。RDS不允许使用任何不被认为是可信任的语言。正如PostgreSQL文档中所解释的:
可信任
可信任
表示该语言不授予用户不能访问的数据。
如果PLV8可以使用库,则可能会通过这些库执行一些操作,例如通过HTTP下载数据或检查文件系统,这将违反此限制,并可能将RDS系统置于黑客攻击的风险之下。
PLV8演示 - Lucio Grenzi的PostgreSQL网页端。
幻灯片#10:
PLV8:一个可信任的语言
[...]
- 无法从文件系统加载外部处理模块
一个可能的替代方案
我使用了PLPERLu
(u
表示不受信任的)语言。使用该语言,您可以使用
库。您的库应位于PostgreSQL使用的PERL安装的标准位置中(在CREATE LANGUAGE
定义时)。
相当一段时间后...在AWS RDS PostgreSQL中,可以使用以下版本调用Lambda函数:
使用如下选择语句:
同步
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
select source
和eval()
,我们失去了 V8 的所有性能...没有办法“预编译”吗? - Peter Kraussplv8
扩展源代码的情况下做的一切。 - klin