<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >PL/Python - Python Procedural Language</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REV="MADE" HREF="mailto:pgsql-docs@postgresql.org"><LINK REL="HOME" TITLE="PostgreSQL 8.0.11 Documentation" HREF="index.html"><LINK REL="UP" TITLE="Server Programming" HREF="server-programming.html"><LINK REL="PREVIOUS" TITLE="Limitations and Missing Features" HREF="plperl-missing.html"><LINK REL="NEXT" TITLE="Trigger Functions" HREF="plpython-trigger.html"><LINK REL="STYLESHEET" TYPE="text/css" HREF="stylesheet.css"><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"><META NAME="creation" CONTENT="2007-02-02T03:57:22"></HEAD ><BODY CLASS="CHAPTER" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="5" ALIGN="center" VALIGN="bottom" >PostgreSQL 8.0.11 Documentation</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="top" ><A HREF="plperl-missing.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="10%" ALIGN="left" VALIGN="top" ><A HREF="plperl.html" >Fast Backward</A ></TD ><TD WIDTH="60%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="top" ><A HREF="spi.html" >Fast Forward</A ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="top" ><A HREF="plpython-trigger.html" ACCESSKEY="N" >Next</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="CHAPTER" ><H1 ><A NAME="PLPYTHON" ></A >Chapter 38. PL/Python - Python Procedural Language</H1 ><DIV CLASS="TOC" ><DL ><DT ><B >Table of Contents</B ></DT ><DT >38.1. <A HREF="plpython.html#PLPYTHON-FUNCS" >PL/Python Functions</A ></DT ><DT >38.2. <A HREF="plpython-trigger.html" >Trigger Functions</A ></DT ><DT >38.3. <A HREF="plpython-database.html" >Database Access</A ></DT ></DL ></DIV ><A NAME="AEN34395" ></A ><A NAME="AEN34397" ></A ><P > The <SPAN CLASS="APPLICATION" >PL/Python</SPAN > procedural language allows <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > functions to be written in the <A HREF="http://www.python.org" TARGET="_top" >Python</A > language. </P ><P > To install PL/Python in a particular database, use <TT CLASS="LITERAL" >createlang plpythonu <TT CLASS="REPLACEABLE" ><I >dbname</I ></TT ></TT >. </P ><DIV CLASS="TIP" ><BLOCKQUOTE CLASS="TIP" ><P ><B >Tip: </B > If a language is installed into <TT CLASS="LITERAL" >template1</TT >, all subsequently created databases will have the language installed automatically. </P ></BLOCKQUOTE ></DIV ><P > As of <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > 7.4, PL/Python is only available as an <SPAN CLASS="QUOTE" >"untrusted"</SPAN > language (meaning it does not offer any way of restricting what users can do in it). It has therefore been renamed to <TT CLASS="LITERAL" >plpythonu</TT >. The trusted variant <TT CLASS="LITERAL" >plpython</TT > may become available again in future, if a new secure execution mechanism is developed in Python. </P ><DIV CLASS="NOTE" ><BLOCKQUOTE CLASS="NOTE" ><P ><B >Note: </B > 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. </P ></BLOCKQUOTE ></DIV ><DIV CLASS="SECT1" ><H1 CLASS="SECT1" ><A NAME="PLPYTHON-FUNCS" >38.1. PL/Python Functions</A ></H1 ><P > Functions in PL/Python are declared in the usual way, for example </P><PRE CLASS="PROGRAMLISTING" >CREATE FUNCTION myfunc(text) RETURNS text AS 'return args[0]' LANGUAGE plpythonu;</PRE ><P> 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 </P><PRE CLASS="PROGRAMLISTING" >def __plpython_procedure_myfunc_23456(): return args[0]</PRE ><P> assuming that 23456 is the OID assigned to the function by <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN >. </P ><P > If you do not provide a return value, Python returns the default <TT CLASS="SYMBOL" >None</TT >. <SPAN CLASS="APPLICATION" >PL/Python</SPAN > translates Python's <TT CLASS="SYMBOL" >None</TT > into the SQL null value.<A NAME="AEN34426" ></A > </P ><P > The <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > function parameters are available in the global <TT CLASS="VARNAME" >args</TT > list. In the <CODE CLASS="FUNCTION" >myfunc</CODE > example, <TT CLASS="VARNAME" >args[0]</TT > contains whatever was passed in as the text argument. For <TT CLASS="LITERAL" >myfunc2(text, integer)</TT >, <TT CLASS="VARNAME" >args[0]</TT > would contain the <TT CLASS="TYPE" >text</TT > argument and <TT CLASS="VARNAME" >args[1]</TT > the <TT CLASS="TYPE" >integer</TT > argument. </P ><P > The global dictionary <TT CLASS="VARNAME" >SD</TT > is available to store data between function calls. This variable is private static data. The global dictionary <TT CLASS="VARNAME" >GD</TT > is public data, available to all Python functions within a session. Use with care.<A NAME="AEN34442" ></A > </P ><P > Each function gets its own execution environment in the Python interpreter, so that global data and function arguments from <CODE CLASS="FUNCTION" >myfunc</CODE > are not available to <CODE CLASS="FUNCTION" >myfunc2</CODE >. The exception is the data in the <TT CLASS="VARNAME" >GD</TT > dictionary, as mentioned above. </P ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="plperl-missing.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="plpython-trigger.html" ACCESSKEY="N" >Next</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Limitations and Missing Features</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="server-programming.html" ACCESSKEY="U" >Up</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Trigger Functions</TD ></TR ></TABLE ></DIV ></BODY ></HTML >