⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plpython.sgml

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 SGML
字号:
<!-- $PostgreSQL: pgsql/doc/src/sgml/plpython.sgml,v 1.29 2005/05/20 01:52:25 neilc Exp $ --><chapter id="plpython"> <title>PL/Python - Python Procedural Language</title> <indexterm zone="plpython"><primary>PL/Python</></> <indexterm zone="plpython"><primary>Python</></> <para>  The <application>PL/Python</application> procedural language allows  <productname>PostgreSQL</productname> functions to be written in the  <ulink url="http://www.python.org">Python language</ulink>. </para> <para>  To install PL/Python in a particular database, use  <literal>createlang plpythonu <replaceable>dbname</></literal>. </para>  <tip>   <para>    If a language is installed into <literal>template1</>, all subsequently    created databases will have the language installed automatically.   </para>  </tip> <para>  As of <productname>PostgreSQL</productname> 7.4, PL/Python is only  available as an <quote>untrusted</> language (meaning it does not  offer any way of restricting what users can do in it).  It has  therefore been renamed to <literal>plpythonu</>.  The trusted  variant <literal>plpython</> may become available again in future,  if a new secure execution mechanism is developed in Python. </para> <note>  <para>   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.  </para> </note> <sect1 id="plpython-funcs">  <title>PL/Python Functions</title>  <para>   Functions in PL/Python are declared via the usual <xref   linkend="sql-createfunction" endterm="sql-createfunction-title">   syntax. For example:<programlisting>CREATE FUNCTION myfunc(text) RETURNS text    AS 'return args[0]'    LANGUAGE plpythonu;</programlisting>   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<programlisting>def __plpython_procedure_myfunc_23456():        return args[0]</programlisting>   assuming that 23456 is the OID assigned to the function by   <productname>PostgreSQL</productname>.  </para>  <para>   If you do not provide a return value, Python returns the default   <symbol>None</symbol>. <application>PL/Python</application> translates   Python's <symbol>None</symbol> into the SQL null   value.<indexterm><primary>null value</><secondary   sortas="PL/Python">in PL/Python</></indexterm>  </para>  <para>   The <productname>PostgreSQL</> function parameters are available in   the global <varname>args</varname> list.  In the   <function>myfunc</function> example, <varname>args[0]</> contains   whatever was passed in as the text argument.  For   <literal>myfunc2(text, integer)</literal>, <varname>args[0]</>   would contain the <type>text</type> argument and   <varname>args[1]</varname> the <type>integer</type> argument.  </para>  <para>   The global dictionary <varname>SD</varname> is available to store   data between function calls.  This variable is private static data.   The global dictionary <varname>GD</varname> is public data,   available to all Python functions within a session.  Use with   care.<indexterm><primary>global data</><secondary>in   PL/Python</></indexterm>  </para>  <para>   Each function gets its own execution environment in the   Python interpreter, so that global data and function arguments from   <function>myfunc</function> are not available to   <function>myfunc2</function>.  The exception is the data in the   <varname>GD</varname> dictionary, as mentioned above.  </para> </sect1> <sect1 id="plpython-trigger">  <title>Trigger Functions</title>  <indexterm zone="plpython-trigger">   <primary>trigger</primary>   <secondary>in PL/Python</secondary>  </indexterm>  <para>   When a function is used as a trigger, the dictionary   <literal>TD</literal> contains trigger-related values.  The trigger   rows are in <literal>TD["new"]</> and/or <literal>TD["old"]</>   depending on the trigger event.  <literal>TD["event"]</> contains   the event as a string (<literal>INSERT</>, <literal>UPDATE</>,   <literal>DELETE</>, or <literal>UNKNOWN</>).   <literal>TD["when"]</> contains one of <literal>BEFORE</>,   <literal>AFTER</>, and <literal>UNKNOWN</>.   <literal>TD["level"]</> contains one of <literal>ROW</>,   <literal>STATEMENT</>, and <literal>UNKNOWN</>.   <literal>TD["name"]</> contains the trigger name, and   <literal>TD["relid"]</> contains the OID of the table on   which the trigger occurred.  If the <command>CREATE TRIGGER</> command   included arguments, they are available in <literal>TD["args"][0]</> to   <literal>TD["args"][(<replaceable>n</>-1)]</>.  </para>  <para>   If <literal>TD["when"]</literal> is <literal>BEFORE</>, you may   return <literal>None</literal> or <literal>"OK"</literal> from the   Python function to indicate the row is unmodified,   <literal>"SKIP"</> to abort the event, or <literal>"MODIFY"</> to   indicate you've modified the row.  </para> </sect1> <sect1 id="plpython-database">  <title>Database Access</title>  <para>   The PL/Python language module automatically imports a Python module   called <literal>plpy</literal>.  The functions and constants in   this module are available to you in the Python code as   <literal>plpy.<replaceable>foo</replaceable></literal>.  At present   <literal>plpy</literal> implements the functions   <literal>plpy.debug(<replaceable>msg</>)</literal>,   <literal>plpy.log(<replaceable>msg</>)</literal>,   <literal>plpy.info(<replaceable>msg</>)</literal>,   <literal>plpy.notice(<replaceable>msg</>)</literal>,   <literal>plpy.warning(<replaceable>msg</>)</literal>,   <literal>plpy.error(<replaceable>msg</>)</literal>, and   <literal>plpy.fatal(<replaceable>msg</>)</literal>.<indexterm><primary>elog</><secondary>in PL/Python</></indexterm>   <function>plpy.error</function> and    <function>plpy.fatal</function> actually raise a Python exception   which, if uncaught, propagates out to the calling query, causing   the current transaction or subtransaction to be aborted.    <literal>raise plpy.ERROR(<replaceable>msg</>)</literal> and   <literal>raise plpy.FATAL(<replaceable>msg</>)</literal> are   equivalent to calling   <function>plpy.error</function> and   <function>plpy.fatal</function>, respectively.   The other functions only generate messages of different   priority levels.   Whether messages of a particular priority are reported to the client,   written to the server log, or both is controlled by the   <xref linkend="guc-log-min-messages"> and   <xref linkend="guc-client-min-messages"> configuration   variables. See <xref linkend="runtime-config"> for more information.  </para>  <para>   Additionally, the <literal>plpy</literal> module provides two   functions called <function>execute</function> and   <function>prepare</function>.  Calling   <function>plpy.execute</function> with a query string and an   optional limit argument causes that query to be run and the result   to be returned in a result object.  The result object emulates a   list or dictionary object.  The result object can be accessed by   row number and column name.  It has these additional methods:   <function>nrows</function> which returns the number of rows   returned by the query, and <function>status</function> which is the   <function>SPI_execute()</function> return value.  The result object   can be modified.  </para>  <para>   For example,<programlisting>rv = plpy.execute("SELECT * FROM my_table", 5)</programlisting>   returns up to 5 rows from <literal>my_table</literal>.  If   <literal>my_table</literal> has a column   <literal>my_column</literal>, it would be accessed as<programlisting>foo = rv[i]["my_column"]</programlisting>  </para>  <para>   <indexterm><primary>preparing a query</><secondary>in PL/Python</></indexterm>   The second function, <function>plpy.prepare</function>, prepares   the execution plan for a query.  It is called with a query string   and a list of parameter types, if you have parameter references in   the query.  For example:<programlisting>plan = plpy.prepare("SELECT last_name FROM my_users WHERE first_name = $1", [ "text" ])</programlisting>   <literal>text</literal> is the type of the variable you will be   passing for <literal>$1</literal>.  After preparing a statement, you   use the function <function>plpy.execute</function> to run it:<programlisting>rv = plpy.execute(plan, [ "name" ], 5)</programlisting>   The third argument is the limit and is optional.  </para>  <para>   When you prepare a plan using the PL/Python module it is   automatically saved.  Read the SPI documentation (<xref   linkend="spi">) for a description of what this means.   In order to make effective use of this across function calls   one needs to use one of the persistent storage dictionaries   <literal>SD</literal> or <literal>GD</literal> (see   <xref linkend="plpython-funcs">). For example:<programlisting>CREATE FUNCTION usesavedplan() RETURNS trigger AS $$    if SD.has_key("plan"):        plan = SD["plan"]    else:        plan = plpy.prepare("SELECT 1")        SD["plan"] = plan    # rest of function$$ LANGUAGE plpythonu;</programlisting>  </para> </sect1><![IGNORE[ <!-- NOT CURRENTLY SUPPORTED --> <sect1 id="plpython-trusted">  <title>Restricted Environment</title>  <para>   The current version of <application>PL/Python</application>   functions as a trusted language only; access to the file system and   other local resources is disabled.  Specifically,   <application>PL/Python</application> uses the Python restricted   execution environment, further restricts it to prevent the use of   the file <function>open</> call, and allows only modules from a   specific list to be imported.  Presently, that list includes:   <literal>array</>, <literal>bisect</>, <literal>binascii</>,   <literal>calendar</>, <literal>cmath</>, <literal>codecs</>,   <literal>errno</>, <literal>marshal</>, <literal>math</>, <literal>md5</>,   <literal>mpz</>, <literal>operator</>, <literal>pcre</>,   <literal>pickle</>, <literal>random</>, <literal>re</>, <literal>regex</>,   <literal>sre</>, <literal>sha</>, <literal>string</>, <literal>StringIO</>,   <literal>struct</>, <literal>time</>, <literal>whrandom</>, and   <literal>zlib</>.  </para> </sect1>]]></chapter>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -