标签: plpython

PostgreSQL PL/Python如何在性能方面与Python之外的Python进行比较?

我运行完全相同的Python函数,一个作为PostgreSQL PL/Python,另一个作为通常的Python脚本在PostgreSQL之外运行.

令人惊讶的是,当我使用PostgreSQL PL/Python时select * from pymax7(20000);,它平均需要65秒,而当我调用通常的Python脚本时,python myscript.py 20000它平均需要48秒.计算运行查询和脚本10次的平均值.

是否应该有这样的差异?PostgreSQL RDBMS(PL/Python)中的Python如何在性能方面与Python之外的Python进行比较?

我在Ubuntu 12.04 64位上运行PostgreSQL 9.1和Python 2.7.

PostgreSQL PL/Python:

CREATE FUNCTION pymax7 (b integer)
  RETURNS float
AS $$    
  a = 0
  for i in range(b):
    for ii in range(b):
      a = (((i+ii)%100)*149819874987) 
  return a
$$ LANGUAGE plpythonu;
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

import time
import sys

def pymax7 (b):     
    a = 0
    for i in range(b):
        for ii in range(b):
            a = (((i+ii)%100)*149819874987) # keeping Python busy
    return a

def main(): …
Run Code Online (Sandbox Code Playgroud)

python postgresql plpython

6
推荐指数
1
解决办法
1746
查看次数

如何在PostgreSQL 9.3 x64 Windows 7上安装PL/Python?

我试图在运行查询的数据库中在PostgreSQL中安装PL/Python v2.x语言:

CREATE EXTENSION plpythonu;
Run Code Online (Sandbox Code Playgroud)

(我从http://www.postgresql.org/docs/9.3/static/plpython.html得到了这个)

但是我收到了这个错误:

ERRO:  não pôde acessar arquivo "$libdir/plpython2": No such file or directory
********** Error **********
ERRO: não pôde acessar arquivo "$libdir/plpython2": No such file or directory
SQL state: 58P01
Run Code Online (Sandbox Code Playgroud)

如何以自动方式安装?我需要在很多电脑上安装它.

python postgresql windows-7-x64 plpython postgresql-9.3

6
推荐指数
1
解决办法
1万
查看次数

将plpython3扩展添加到Postgres / timescaledb Alpine Docker Image

我尝试将plpython3扩展名添加到我的timescaledb/ postgres(基于Linux alpine)映像中:

FROM timescale/timescaledb:0.9.0-pg10

RUN set -ex \
    && apk add --no-cache --virtual .plpython3-deps --repository http://nl.alpinelinux.org/alpine/edge/testing \
    postgresql-plpython3
Run Code Online (Sandbox Code Playgroud)

当我尝试创建扩展名时,出现以下错误:

postgres=# CREATE EXTENSION plpython3u;
ERROR:  could not open extension control file "/usr/local/share/postgresql/extension/plpython3u.control": No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是,当我在容器中搜索文件时,可以在其他目录中找到它们:

/ # find / -name '*plpy*'
/usr/lib/postgresql/plpython3.so
/usr/share/postgresql/extension/plpython3u.control
/usr/share/postgresql/extension/plpython3u--1.0.sql
/usr/share/postgresql/extension/plpython3u--unpackaged--1.0.sql
Run Code Online (Sandbox Code Playgroud)

如何安装postgresql-plpython3到其他目录或配置postgres为识别添加的扩展名?

更新资料

当我只是要发送mv的文件时,/usr/local/share/postgresql/extension出现错误:

postgres=# CREATE EXTENSION plpython3u;
ERROR:  could not access file "$libdir/plpython3": No such file or directory
Run Code Online (Sandbox Code Playgroud)

更新2 …

postgresql plpython docker alpine-linux timescaledb

6
推荐指数
1
解决办法
1286
查看次数

使用python finditer,我该如何替换每个匹配的字符串?

我正在使用Python(实际上是pl/python)在一个非常大的文本对象中连续查找一系列正则表达式匹配.这工作正常!每个匹配都是不同的结果,每个替换将是不同的结果,最终基于循环内的查询.

目前,我很乐意用任何文本替换rx中的每个匹配,这样我就能理解它是如何工作的.有人能给我一个替换匹配文本的明确例子吗?

match.group(1)似乎正确表示匹配的文本; 这是做事的方式吗?

plan3 = plpy.prepare("SELECT field1,field2 FROM sometable WHERE indexfield = $1", 
  [ "text" ])

rx = re.finditer('LEFT[A-Z,a-z,:]+RIGHT)', data)

# above does find my n matches...

# -------------------  THE LOOP  ----------------------------------
for match in rx:
 # below does find the 6 match objects - good!

 # match.group does return the text
 plpy.notice("--  MATCH: ", match.group(1))

 # must pull out a substring as the 'key' to an SQL find (a separate problem)
 # (not sure how …
Run Code Online (Sandbox Code Playgroud)

python iterator plpython

5
推荐指数
1
解决办法
3741
查看次数

在事务中包装 postgresql 命令:truncate vs delete 或 upsert/merge

我在 postgresql 9.1.3 中使用以下命令将数据从临时临时表移动到 Web 应用程序(地理服务器)中使用的表,所有这些都在同一个数据库中。然后删除临时表。

  1. 截断 table_foo;

  2. 插入 table_foo

    SELECT * FROM table_temp;

  3. 删除表 table_temp;

我想将它包装在一个事务中以允许并发。数据集小于 2000 行,截断比删除快。

  • 在事务中运行这些命令的最佳方式是什么?
  • 是否建议在 CTE 中创建函数或编写 UPSERT/MERGE 等?
  • 删除所有行然后从临时表批量插入而不是 TRUNCATE 会更好吗?
  • 在允许回滚 TRUNCATE 或 DELETE 的 postgres 中?
  • 临时表每天通过在 arcpy 中编写的 ETL 提供,我如何在 postgres 中自动执行截断/删除/批量插入部分?
  • 我愿意使用 PL/pgsql、PL/python(或为 postgres 推荐的 py)

目前,我正在将临时临时表导入我的数据库后手动执行 sql 命令。

postgresql truncate plpgsql common-table-expression plpython

5
推荐指数
1
解决办法
3992
查看次数

在PL/Python函数之间重用纯Python函数

我想在两个或更多PL/Python函数之间声明和共享一些简单,纯粹的python函数.我正在使用Postgres 9.3.

例如,我有:

 CREATE OR REPLACE FUNCTION get_mod(modifier varchar)
  RETURNS varchar
    AS $$
      def is_float(val):
        try:
            if val:
               float(val)
               return True
            else:
               return False
        except ValueError:
            return False
      if modifier is None:
        return "NOMOD"
      if is_float(modifier):
        return str(float(modifier)*1)
      return modifier
    $$ LANGUAGE plpythonu;
Run Code Online (Sandbox Code Playgroud)

我想is_float在其他一些PL/Python函数中使用函数.我知道我可以创建它作为可调用的PL/Python函数,但我发现更多的笨重(执行基于SQL的PL/Python调用),而不是直接调用纯Python,自定义实用程序函数.

是否可以在Postgres上通过PL/Python可重用的纯Python函数创建和公开?

python postgresql plpython

5
推荐指数
1
解决办法
925
查看次数

无法加载库 plpython3.dll

在 Postgresql 版本 10 中创建扩展时出现错误

无法加载库“C:/Program Files/PostgreSQL/10/lib/plpython3.dll”:找不到指定的模块

CREATE EXTENSION plpython3u;
Run Code Online (Sandbox Code Playgroud)

注意:在 Window 10 上使用 Postgresql 10

plpython postgres-plpython postgresql-10

5
推荐指数
1
解决办法
5503
查看次数

无法在 Mac 上安装支持 python3 的 postgres

和都已安装在我的系统上postgres-因此尝试了以下操作:python3High Sierra

brew upgrade  postgres --with-python
Run Code Online (Sandbox Code Playgroud)

我原以为--with-python只会安装postgres plpython3u 语言支持。然而它试图[重新]安装 python 本身。

  /usr/local/Cellar/sqlite/3.26.0: 11 files, 3.7MB
==> Installing postgresql dependency: python
==> Downloading https://homebrew.bintray.com/bottles/python-3.7.2.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring python-3.7.2.high_sierra.bottle.tar.gz
Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Directory not empty @ dir_s_rmdir - /usr/local/opt/python3
Error: Directory not empty @ dir_s_rmdir - /usr/local/opt/python3
Run Code Online (Sandbox Code Playgroud)

然后当尝试加载时plpython3u我们看到:

19:44:24/sbgmaster2 $psql
psql (10.3)
Type "help" for …
Run Code Online (Sandbox Code Playgroud)

python postgresql plpython

5
推荐指数
0
解决办法
799
查看次数

在plpython3u过程中导入Python包时出现“找不到模块”

plpython3postgres数据库上使用存储功能MacOS(已安装标准Enterprise DB软件包)。

我可以导入标准的python包,例如:

CREATE OR REPLACE FUNCTION foo(x double precision)
RETURNS double precision
LANGUAGE plpython3u
AS $$
import math
...
$$
Run Code Online (Sandbox Code Playgroud)

但是,我无法导入安装在我机器上常规python3目录中的安装包,该目录由brew定义:

$ which python3
/usr/local/bin/python3
Run Code Online (Sandbox Code Playgroud)

import foo即使它在常规python3环境中也可以,所以将无法工作。

PostgreSQL运行时服务器是否可能没有使用与我相同的python3环境plpython3u?(也许它正在使用python3解释器,这是MacOS等问题的标准问题。)在这种情况下,我该如何检查以及如何更正配置?

实际上,我创建了一个get_py执行以下操作的存储函数:

import os
return os.popen('which python').read()
Run Code Online (Sandbox Code Playgroud)

它返回:

> select get_py()
+-----------------+
| get_py          |
|-----------------|
| /usr/bin/python |
+-----------------+
Run Code Online (Sandbox Code Playgroud)

(对于则一无所有which python3)。这似乎表明它没有使用我想要的解释器!

我该如何改变?

配置信息

  • PostgreSQL 11.5x86_64-apple-darwin,苹果LLVM 6.0版本编译
  • 我在virtualenv这里不使用任何东西。

python postgresql macos python-3.x plpython

5
推荐指数
1
解决办法
151
查看次数

如何控制plpython3使用哪个Python版本?

我有一个在 CentOS 7 上运行的 postgres 11 数据库,并尝试使用 PL/python,但需要指向 python 解释器的特定版本。我需要使用python3.9,而它正在使用python3.6。我目前无法卸载 python3.6,因此希望以某种方式将 plpython3 指向我的 python3.9 解释器。

我已经安装了包 postgresql-plpython3:

sudo yum install -y postgresql-plpython3

我在 PG 中创建了一个扩展,可以运行一个简单的 PL/python 函数来报告所使用的版本:

CREATE OR REPLACE FUNCTION pyver ()
RETURNS TEXT
AS $$
    import sys
    pyversion = sys.version
    return pyversion
$$ LANGUAGE 'plpython3u';
Run Code Online (Sandbox Code Playgroud)

执行它会返回:

# select pyver();
                  pyver
-----------------------------------------
 3.6.8 (default, Nov 16 2020, 16:55:22) +
 [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
(1 row)
Run Code Online (Sandbox Code Playgroud)

在我的操作系统上,我有以下 python 解释器文件及其使用的版本:

$ /usr/bin/python3 --version
Python 3.9.6

$ python3 --version
Python …
Run Code Online (Sandbox Code Playgroud)

plpython python-3.9

5
推荐指数
1
解决办法
1373
查看次数