pg使用python编写存储过程_PostgreSQL PL / Python:在virtualenv中调用存储过程

当我在我的Python应用程序中调用PostgreSQL PL / Python存储过程时,它似乎在作为用户postgres运行的单独进程中执行.到目前为止,这只会产生副作用,我必须使我的日志文件对我自己和数据库用户都可写,因此应用程序和存储过程都可以写入它.

然而,现在我开始使用virtualenv并在我的〜/ .virtualenvs / virt_env / lib / python2.7 / site-packages /文件夹中添加了许多.pth文件,这些文件将我的模块的路径添加到Python路径中.

执行存储过程时,用户postgres与我不在同一个虚拟环境中,因此存储过程找不到我的模块.我可以在global PostgreSQL environment中修改PYTHONPATH,但每次切换虚拟环境时我都要改变它 – 这有点违背了virtualenv的目的……

如何扩展存储过程的Python路径?

更新:

解决方法:

事实证明,有一种方法可以做到这一点.从版本1.6或那里开始,virtualenv附带了一个脚本activate_this.py,它可用于设置现有的解释器来访问特定的virtualenv.

exec(open('/Some/VirtualEnv/Directory/myvirtualenv/bin/activate_this.py').read(),

dict(__file__='/Some/VirtualEnv/Directory/myvirtualenv/bin/activate_this.py'))

并作为一个完全实现的plpython功能:

CREATE OR REPLACE FUNCTION workon(venv text)

RETURNS void AS

$BODY$

import os

import sys

if sys.platform in ('win32', 'win64', 'cygwin'):

activate_this = os.path.join(venv, 'Scripts', 'activate_this.py')

else:

if not os.environ.has_key('PATH'):

import subprocess

p=subprocess.Popen('echo -n $PATH', stdout=subprocess.PIPE, shell=True)

(mypath,err) = p.communicate()

os.environ['PATH'] = mypath

activate_this = os.path.join(venv, 'bin', 'activate_this.py')

exec(open(activate_this).read(), dict(__file__=activate_this))

$BODY$

LANGUAGE plpythonu VOLATILE

(需要额外的PATH mungery,因为默认情况下,plpy在plpython os.environ中不可用 –

activate_this.py有一个fix checked in应该下一个点发布(应该是1.11.7或1.12)

标签:python,postgresql,stored-procedures,virtualenv,plpython

来源: https://codeday.me/bug/20190902/1790620.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值