Может ли расширение языка plv8 JavaScript вызывать сторонние библиотеки?
В Postgresql я хочу вызывать сторонние библиотеки, такие как moment.js или AWS lambda JS Client, чтобы вызывать функции без сервера из БД. Я не вижу никаких документов или примеров, как это сделать: https://github.com/plv8/plv8/blob/master/README.md
Возможно ли это, и где я могу найти примеры того, как "импортировать" или "требовать" дополнительные библиотеки?
3 ответа
Язык 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
вAmazon RDS PosgreSQL. RDS не позволяет использовать язык, которому нельзядоверять. Как объяснено в документации PostgreSQL:ДОВЕРЕННЫЕ
TRUSTED
указывает, что язык не предоставляет доступ к данным, которые пользователь не имел бы в противном случае.Если бы PLV8 мог использовать библиотеки, они (скорее всего) позволили бы выполнять такие операции, как загрузка данных через HTTP или проверку файловой системы, что противоречило бы этому ограничению (и, возможно, подвергало систему RDS риску взлома).
Презентация PLV8 - веб-часть PostgreSQL от Lucio Grenzi.
Слайд № 10:
PLV8: язык, которому доверяют
[...]
- нет способа загрузить внешние модули обработки из файловой системы
Возможная альтернатива
Я использовал PLPERLu
(u
то есть ненадежный) язык. Используя этот язык, вы можетеuse
библиотеки. Ваши библиотеки должны находиться в стандартных местах для установки PERL, используемой PostgreSQL (как определено, когда выCREATE LANGUAGE
).
Спустя некоторое время... в AWS RDS PostgreSQL можно вызывать функции Lambda в версиях:
- 14.1 и выше минорные версии
- 13.2 и выше минорные версии
- 12.6 и выше минорные версии
с операторами select, такими как:
Синхронный
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 .