Playing with PL/Python#
Prerequisites:
sudo apt-get install postgresql-plpython-9.3
# must be superuser to create procedural language "plpythonu"
sudo -Hnu postgres psql -c "ALTER USER felix WITH SUPERUSER"
sudo -Hnu postgres psql -c "CREATE EXTENSION plpythonu"
# or for a certain DB:
sudo -Hnu postgres psql $dbname -c "CREATE EXTENSION plpythonu"
Simple function that returns a table:
CREATE FUNCTION store_foo()
RETURNS TABLE (id int, name text)
AS $$
return (
dict(id=i, name='foo-{0}'.format(i))
for i in range(1000)
)
$$ LANGUAGE plpythonu;
select * from store_foo();
Importing modules from anywhere at runtime#
The cleaner solution would be to set PYTHONPATH for the postgresql server process.
Example module:
mkdir -p /tmp/foo
cat <<EOF > /tmp/foo/foo.py
def f():
return 'hello from foo'
EOF
Function:
CREATE FUNCTION foo_module()
RETURNS text
AS $$
import sys
sys.path.insert(0, '/tmp/foo')
import foo
return foo.f()
$$ LANGUAGE plpythonu;
select foo_module();
Multicorn#
Prerequisites:
sudo apt-get install postgresql-server-dev-9.3
sudo pip install pgxnclient
sudo pgxn install multicorn