PostgreSQL Python 教程: 调用 PostgreSQL 函数

八月 14, 2023

摘要:在本教程中,您将学习如何从 Python 程序调用 PostgreSQL 函数。

在 Python 中调用 PostgreSQL 函数的步骤

要从 Python 程序调用 PostgreSQL 函数,请使用以下步骤:

首先,通过调用psycopg2模块的connect()函数创建一个新的数据库连接,连接到 PostgreSQL 数据库服务器。

conn = psycopg2.connect(dsn)

connect()方法会返回一个connection类的新实例。

接下来,通过调用连接对象的cursor()方法创建一个新游标。

cur = conn.cursor()

然后,将函数名称和可选输入值传递给游标对象的callproc()方法。

cur.callproc('function_name', (value1,value2))

在内部,callproc()方法会将函数调用和输入值转换为以下语句:

SELECT * FROM function_name(value1, value2);

因此,可以使用游标对象的execute()方法来调用函数,如下所示:

cur.execute("SELECT * FROM function_name( %s,%s); ",(value1,value2))

两种形式的语句具有相同的效果。

之后,使用fetchone()fetchall()、或fetchmany()方法处理函数返回的结果集。

最后,调用cursorconnection对象的close()方法,关闭与 PostgreSQL 数据库服务器的通信。

cur.close()
conn.close()

调用函数示例

下面的get_parts_by_vendors()函数返回指定供应商提供的部件列表。

CREATE OR REPLACE FUNCTION get_parts_by_vendor(id integer)
  RETURNS TABLE(part_id INTEGER, part_name VARCHAR) AS
$$
BEGIN
 RETURN QUERY

 SELECT parts.part_id, parts.part_name
 FROM parts
 INNER JOIN vendor_parts on vendor_parts.part_id = parts.part_id
 WHERE vendor_id = id;

END;
$$ LANGUAGE plpgsql;

下面的get_parts()函数调用get_parts_by_vendors()函数:

#!/usr/bin/python
import psycopg2
from config import config

def get_parts(vendor_id):
    """ get parts provided by a vendor specified by the vendor_id """
    conn = None
    try:
        # read database configuration
        params = config()
        # connect to the PostgreSQL database
        conn = psycopg2.connect(**params)
        # create a cursor object for execution
        cur = conn.cursor()
        # another way to call a function
        # cur.execute("SELECT * FROM get_parts_by_vendor( %s); ",(vendor_id,))
        cur.callproc('get_parts_by_vendor', (vendor_id,))
        # process the result set
        row = cur.fetchone()
        while row is not None:
            print(row)
            row = cur.fetchone()
        # close the communication with the PostgreSQL database server
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

下面调用get_parts()函数来获取 id 为 1 的供应商提供的部件列表:

if __name__ == '__main__':
    get_parts(1)

在本教程中,您逐步学习了如何在 Python 中调用 PostgreSQL 函数。