【问题标题】:Can plv8 JavaScript language extension call 3rd party libraries?plv8 JavaScript 语言扩展可以调用第三方库吗?
【发布时间】:2017-12-21 05:06:54
【问题描述】:

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

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

【问题讨论】:

    标签: postgresql plv8


    【解决方案1】:

    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() 函数:A Deep Dive into PL/v8.。它基于plv8.start_proc(另见short example here)。

    【讨论】:

    • 丑陋的解决方案:select sourceeval() 我们失去了 V8 的所有性能...没有办法“预编译”吗?
    • 我不认为它难看。这只是您可以在不干扰 plv8 扩展程序源代码的情况下做的所有事情。
    • ...嗯...没有预编译方式? (没有办法在 eval 之后注册到 PostgreSQL user-calalog-lib?)
    • @PeterKrauss - 我忘记了,还有初始化功能,见Is it possible to create a re-usable function with the PostgreSQL plv8 extension?中的第二个选项
    • 谢谢,这正是我想要的。 (经过编辑以简化其他读者)。
    【解决方案2】:

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

    1. You can use PLV8 in Amazon RDS PosgreSQL。 RDS 不允许使用任何不受信任的语言。如 PostgreSQL 文档中所述:

      受信任

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

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

    2. 演示 PLV8 - The PostgreSQL web side Lucio Grenzi。

      幻灯片 #10:

      PLV8:值得信赖的语言

        [...]

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

    可能的替代方案

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-21
      • 2018-07-21
      • 2018-01-12
      • 2017-06-22
      • 2011-03-19
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多