8

在 Postgresql 中,我想调用像 moment.js 或 AWS lambda JS Client 这样的第三方库来从数据库中调用无服务器函数。我没有看到任何文档或示例如何这样做: https ://github.com/plv8/plv8/blob/master/README.md

这可能吗?我在哪里可以找到如何“导入”或“需要”其他库的示例?

4

2 回答 2

10

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

使用模块的源代码创建一个表并使用 and 加载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(另请参见此处的简短示例)。

于 2017-07-16T18:08:32.730 回答
1

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

  1. 您可以PLV8Amazon RDS PosgreSQL中使用。RDS 不允许任何不受信任的语言。如 PostgreSQL 文档中所述:

    值得信赖

    TRUSTED指定语言不授予对用户本来没有的数据的访问权限。

    如果 PLV8 可以使用库,那么这些库(很可能)将允许执行诸如通过 HTTP 下载数据或检查文件系统之类的操作,这将违反此限制(并可能使 RDS 系统面临黑客攻击风险)。

  2. Presentation PLV8 - Lucio Grenzi的 PostgreSQL web 端.

    幻灯片#10:

    PLV8:值得信赖的语言

      [...]

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

一个可能的替代方案

我使用了PLPERLuu意思是不受信任的)语言。使用该语言,您可以使用use库。您的库应该位于 PostgreSQL 使用的 PERL 安装的标准位置(如您在 PostgreSQL 中定义的那样CREATE LANGUAGE)。

于 2017-07-16T17:20:56.220 回答