【发布时间】:2015-11-11 23:35:59
【问题描述】:
我正在编写的 Python 代码与 PostgreSQL 数据库建立了psycopg2 连接。我需要从这个数据库中的数据构建一些报告,所以我有几个 Python procs 定期运行并从一些表和漂亮的查询中创建一个 csv 文件。
我在这里面临的问题是我需要在我的 csv 报告中包含一个列,该列是存储在 PostgreSQL 数据库中的函数的结果。该数据库由另一组人管理,因此我无法写入。我可以很容易地看到该函数的内容并模拟 Python 上的行为并获得我需要计算的列值,但在这种情况下,该函数会定期更改,并且不断更新 Python 函数是没有意义的。
所以我的问题是,每次我的代码连接到数据库时,是否有可能以某种方式将数据库函数加载到 Python 代码中。我可以在数据库本身上实际使用该函数,但想象一下从 Python 代码对数据库函数进行 90 万次调用以计算值,根本无法扩展。
编辑:添加sql函数
CREATE OR REPLACE FUNCTION public.p_start(integer, integer)
RETURNS numeric
LANGUAGE sql
IMMUTABLE
AS $function$
SELECT CASE WHEN $1 = 0 AND $2 = 0 THEN 0.2760
WHEN $1 = 0 AND $2 = 1 THEN 0.0684
WHEN $1 = 0 AND $2 = 2 THEN 0.0277
WHEN $1 = 0 AND $2 = 3 THEN 0.0189
WHEN $1 = 0 AND $2 = 4 THEN 0.0038
WHEN $1 = 0 AND $2 = 5 THEN 0.0098
WHEN $1 = 1 AND $2 = 1 THEN 0.5501
WHEN $1 = 1 AND $2 = 2 THEN 0.2264
WHEN $1 = 1 AND $2 = 3 THEN 0.1203
WHEN $1 = 1 AND $2 = 4 THEN 0.0804
WHEN $1 = 1 AND $2 = 5 THEN 0.0839
ELSE 0.1 END;
$function$
谢谢
【问题讨论】:
-
那么您想将查询转换为 Python 函数吗?还是您想从 Python 执行查询?
-
@zom-pro 只要我避免往返数据库并获得可以直接在 Python 上使用并写入 csv 的结果,其中任何一个都是有效的。
-
查询有多大?我问是因为如果翻译成 Python,你会失去 SQL 优化。这可能是使用数据库最有力的理由,除非查询很小,在这种情况下它无关紧要。
-
数据库函数是用PL/PgSQL写的吗? PL/Python?其他?它自己做数据库访问吗?
标签: python database postgresql psycopg2