我有一个用 PL/Python 编写的函数。它是一个在 Python 中运行的数据库函数,这是允许的,因为通过以下方式安装了一种过程语言:
CREATE PROCEDURAL LANGUAGE 'plpythonu' HANDLER plpython_call_handler
(我发现了一个很好的技巧,允许非管理员用户运行,通过使用一个唯一的名称,虽然它与我的问题没有太大关系,我相信你们中的一些人会想知道我是如何做到这一点的,所以下面是答案)
CREATE TRUSTED PROCEDURAL LANGUAGE 'plpythonu2' HANDLER plpython_call_handler
GRANT USAGE ON LANGUAGE plpythonu2 TO admin;
现在到手头的问题,我上面的“hack”对我有用,但是如果我想使用亚马逊的 RDS 服务,我无法安装语言,并且 PL/Python 不可用。然而,SQL 是。
因此,我需要帮助将以下用 Python 编写的函数翻译成纯 SQL。
CREATE OR REPLACE FUNCTION "public"."human_readable_bits" (
"b" bigint = 0
)
RETURNS varchar AS
$body$
import math
if b:
exponent = math.floor(math.log(b)/math.log(1024))
val = b/pow(1024, math.floor(exponent))
val = round(val*2)/2 -- This rounds to the nearest HALF (X.5) B, Kb, Mb, Gb, etc.
return "%.2f %s" % (val, ('B','Kb','Mb','Gb','Tb','Pb','Eb','Zb','Yb')[int(exponent)])
else:
return "0 Gb"
$body$
LANGUAGE 'plpythonu2'
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 100;
此功能允许我执行以下查询:
=> SELECT human_readable_bits(3285824466906);
human_readable_bits
---------------------
3.00 Tb
(1 row)
或者
=> SELECT human_readable_bits(5920466906);
human_readable_bits
---------------------
5.50 Gb
(1 row)
另外,作为一个旁注/次要问题,在我创建函数之后,当我查看 DDL 时,其中有一行写着“安全调用者”,有人知道这意味着什么吗?