## Chapter 39. PL/Python - Python Procedural Language

The PL/Python procedural language allows PostgreSQL functions to be written in the Python language.

To install PL/Python in a particular database, use `createlang plpythonu `dbname``.

### Tip

If a language is installed into `template1`, all subsequently created databases will have the language installed automatically.

As of PostgreSQL 7.4, PL/Python is only available as an “untrusted” language (meaning it does not offer any way of restricting what users can do in it). It has therefore been renamed to `plpythonu`. The trusted variant `plpython` may become available again in future, if a new secure execution mechanism is developed in Python.

### Note

Users of source packages must specially enable the build of PL/Python during the installation process. (Refer to the installation instructions for more information.) Users of binary packages might find PL/Python in a separate subpackage.

## 39.1. PL/Python Functions

Functions in PL/Python are declared via the usual CREATE FUNCTION syntax. For example:

    CREATE FUNCTION myfunc(text) RETURNS text
        AS 'return args[0]'
        LANGUAGE plpythonu;

The Python code that is given as the body of the function definition gets transformed into a Python function. For example, the above results in

    def __plpython_procedure_myfunc_23456():
            return args[0]

assuming that 23456 is the OID assigned to the function by PostgreSQL.

If you do not provide a return value, Python returns the default `None`. PL/Python translates Python's `None` into the SQL null value.

The PostgreSQL function parameters are available in the global `args` list. In the `myfunc` example, `args[0]` contains whatever was passed in as the text argument. For `myfunc2(text, integer)`, `args[0]` would contain the `text` argument and `args[1]` the `integer` argument.

The global dictionary `SD` is available to store data between function calls. This variable is private static data. The global dictionary `GD` is public data, available to all Python functions within a session. Use with care.

Each function gets its own execution environment in the Python interpreter, so that global data and function arguments from `myfunc` are not available to `myfunc2`. The exception is the data in the `GD` dictionary, as mentioned above.