标签: plpython

如何为postgres pl/python安装第三方模块?

我需要在pl/python函数中导入第三方模块.似乎pl/python使用的内部python没有任何第三方模块.

我遇到这种错误:

ERROR:  PL/Python: PL/Python function "to_tsvector_luc" failed
DETAIL:  <type 'exceptions.ImportError'>: No module named lucene

********** Error **********

ERROR: PL/Python: PL/Python function "to_tsvector_luc" failed
SQL state: XX000
Detail: <type 'exceptions.ImportError'>: No module named lucene
Run Code Online (Sandbox Code Playgroud)

如何将模块安装到pl/python中,以便我可以从存储过程代码中导入它?

postgresql plpython

19
推荐指数
3
解决办法
7384
查看次数

postgres和python

在postgres 9.2中,我试图创建一个可以作为触发器的python程序.我想运行一个外部程序(本地磁盘上的exe),所以我使用python来运行它.当我尝试创建一个这样的简单程序时:

CREATE FUNCTION one ()
RETURNS int
AS $$
# PL/Python function body
$$ LANGUAGE plpythonu;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ERROR:  language "plpythonu" does not exist
HINT:  Use CREATE LANGUAGE to load the language into the database.
Run Code Online (Sandbox Code Playgroud)

当我跑:

CREATE LANGUAGE plpythonu
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ERROR:  could not access file "$libdir/plpython2": No such file or directory
Run Code Online (Sandbox Code Playgroud)

我使用的是Windows 7和python 2.5.

我在许多地方看过但找不到解决方案.

有任何想法吗?

python postgresql plpython

19
推荐指数
3
解决办法
2万
查看次数

Postgres中的Unicode规范化

我有大量苏格兰和威尔士的重音地名(结合严重,急性,旋律和暗音),我需要更新到他们的unicode规范化形式,例如,更短的形式00E1(\ xe1)á代替0061 + 0301(\X61\X301)

我从2009年的一个旧的Postgres nabble邮件列表中找到了一个解决方案,使用pl/python,

create or replace function unicode_normalize(str text) returns text as $$
  import unicodedata
  return unicodedata.normalize('NFC', str.decode('UTF-8'))
$$ LANGUAGE PLPYTHONU;
Run Code Online (Sandbox Code Playgroud)

这正如预期的那样有效,但让我想知道是否有任何方法可以直接使用内置的Postgres函数.我尝试使用convert_to进行各种转换,都是徒劳的.

编辑:正如克雷格指出的那样,我尝试过的其中一件事:

SELECT convert_to(E'\u00E1', 'iso-8859-1');
Run Code Online (Sandbox Code Playgroud)

返回\xe1,而

SELECT convert_to(E'\u0061\u0301', 'iso-8859-1');
Run Code Online (Sandbox Code Playgroud)

失败了 ERROR: character 0xcc81 of encoding "UTF8" has no equivalent in "LATIN1"

postgresql unicode plpython

17
推荐指数
1
解决办法
2614
查看次数

如何处理plpython中的import语句?

我有一个plypython函数,可以做一些json魔法.为此,它显然导入了json库.

每次调用函数时是否调用导入?我必须注意哪些性能影响?

python postgresql json plpython postgresql-9.1

16
推荐指数
2
解决办法
3181
查看次数

如何在Python中将匹配对聚合到"连接组件"中

现实世界的问题:

我有许多公司的董事数据,但有时候"XYZ的董事John Smith"和"ABC的董事John Smith"是同一个人,有时他们不是.此外,"XYZ的导演约翰J.史密斯"和"ABC的导演约翰史密斯"可能是同一个人,也可能不是.通常检查附加信息(例如,关于"约翰史密斯,XYZ主任"和"约翰史密斯,ABC主任"的传记数据的比较)使得有可能解决两个观察是否是同一个人.

问题的概念版本:

本着这种精神,我正在收集识别匹配对的数据.例如,假设我有以下匹配对:{(a, b), (b, c), (c, d), (d, e), (f, g)}.我想使用关系"与人相同"的传递属性来生成"连通组件" {{a, b, c, d, e}, {f, g}}.那是{a, b, c, d, e}一个人,{f, g}是另一个人.(该问题的早期版本提到了"派系",这显然是别的东西;这可以解释为什么find_cliquesnetworkx给出"错误"结果(为了我的目的).

以下Python代码完成了这项工作.但我想知道:是否有更好的(计算成本更低)方法(例如,使用标准或可用的库)?

这里和那里似乎有相关的例子(例如,python中的Cliques),但这些是不完整的,所以我不确定他们指的是什么库或如何设置我的数据来使用它们.

示例Python 2代码:

def get_cliques(pairs):
    from sets import Set

    set_list = [Set(pairs[0])]

    for pair in pairs[1:]:
        matched=False
        for set in set_list:
            if pair[0] in set or pair[1] in set:
                set.update(pair)
                matched=True
                break
        if not matched:
            set_list.append(Set(pair))

    return set_list

pairs …
Run Code Online (Sandbox Code Playgroud)

python postgresql clique plpython connected-components

16
推荐指数
1
解决办法
3916
查看次数

如何使用Travis CI测试Pl/Python PostgreSQL程序?

我正在尝试为Travis CI中的一些PL/Python PostgreSQL程序设置CI.

我尝试了几种方法:
1)使用遗留的基础设施,我试图假设,PL/Python已经安装,但它没有成功:

The command "psql -U postgres -c 'CREATE EXTENSION plpythonu;'" exited with 1.
0.01s$ psql -U postgres -d test -c 'CREATE LANGUAGE plpythonu;'
ERROR:  could not access file "$libdir/plpython2": No such file or directory  
Run Code Online (Sandbox Code Playgroud)

2)尝试sudo apt-get update && sudo apt-get -y install postgresql-plpython-9.4在开头添加命令.它也失败了,因为这个命令开始替换已经安装在Travis环境中的PostgresSQL 9.4.

Travis构建.

3)还试图在配置中使用基于容器的基础设施:

addons:
  postgresql: "9.4"
  apt:
    packages:
      - postgresql-plpython-9.4
Run Code Online (Sandbox Code Playgroud)

也没有成功.

在Travis CI中测试PL/Python过程的好方法是什么?

python postgresql continuous-integration plpython travis-ci

13
推荐指数
1
解决办法
780
查看次数

在postgresql 8或9中安装plpython

我想在postgresql上安装plpython以获得python触发器

当我恢复我的数据库(我的数据库有一些python触发器)这个错误apears(错误消息太大所以我粘贴它的第一行):

C:/Program Files/PostgreSQL/9.0/bin/pg_restore.exe
   --host localhost
   --port 5432
   --username "postgres"
   --dbname "mfa"
   --verbose
   "%HOMEPATH%/Desktop/EhSAA/MFA/db_schema/mydb.backup"

pg_restore: connecting to database for restore
pg_restore: creating SCHEMA public
pg_restore: creating COMMENT SCHEMA public
pg_restore: creating PROCEDURAL LANGUAGE plpgsql
pg_restore: creating PROCEDURAL LANGUAGE plpythonu
pg_restore: [archiver (db)] Error while PROCESSING TOC:

pg_restore: [archiver (db)] Error from TOC entry 315; 2612 16595
                                  PROCEDURAL LANGUAGE plpythonu postgres

pg_restore: [archiver (db)] could not execute query:
ERROR: could not load library "C:/Program Files/PostgreSQL/9.0/lib/plpython.dll":
The specified module could not be …
Run Code Online (Sandbox Code Playgroud)

python postgresql install plpython

8
推荐指数
1
解决办法
5528
查看次数

使用python 2.7在mac上安装plpython

我需要安装plpython,因为我收到了错误

could not access file "$libdir/plpython2": No such file or directory
Run Code Online (Sandbox Code Playgroud)

当试图做python manage.py migrate时.我已经看到了关于如何安装这个软件包的不同建议,但没有一个对我有用,因为我需要使用python版本2.7(有些人建议安装python 3.2),我不能运行sudo apt-get install ...因为我必须是在mac上工作.

我试过跑步

CREATE LANGUAGE plpython2u;
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

ERROR:  could not access file "$libdir/plpython2": No such file or directory
Run Code Online (Sandbox Code Playgroud)

另外,我试过了pip/brew install plpython.但没有结果.有什么建议?

postgresql macos python-2.7 plpython

7
推荐指数
1
解决办法
1517
查看次数

在 PostgreSQL 中,`print` 的 plpython(3)u 输出到哪里去了?

当我在 PostgreSQL 中创建以下函数时:

create function log( value variadic text[] )
  returns void
  language plpython3u
  as $$
    print( ' '.join( value ) + '\n' )
    $$;

do $$ begin perform log( ( 42 + 108 )::text ); end; $$;
Run Code Online (Sandbox Code Playgroud)

输出未出现在终端中(使用psql -f ...)。它会去哪里?

此外,是否有任何简单的方法(可能是扩展)可以为我提供易于使用的输出stdout/ stderr?我不想使用,select因为所有输出都带有表装饰,您可以关闭它,但只能使用psql在函数中不起作用的技巧。同样,我不想使用\echo,因为这在函数定义中不起作用。

编辑我知道plpy.notice(),但该功能也将其输出包围在一大堆混乱中。


顺便说一句,我现在的解决方案是写入文件:

create function log( value variadic text[] )
  returns void
  language plpython3u
  as $$
    with open( '/tmp/psql-output', 'a' ) as o:
      o.write( …
Run Code Online (Sandbox Code Playgroud)

python postgresql plpython

7
推荐指数
1
解决办法
1248
查看次数

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
查看次数