PostgreSQL Python 教程: 查询数据

八月 13, 2023

摘要:在本教程中,您将学习如何使用 psycopg 数据库适配器在 Python 中查询 PostgreSQL 表中的数据。

Python 中从 PostgreSQL 表中查询数据的步骤

要在 Python 中查询一个或多个 PostgreSQL 表中的数据,请使用以下步骤。

首先,通过调用psycopg模块的connect()函数,建立与 PostgreSQL 数据库服务器的连接

conn = psycopg2.connect(dsn)

如果连接创建成功,connect()函数会返回一个新的connection对象,否则会抛出DatabaseError异常。

接下来,通过调用该connection对象的cursor()方法创建一个新游标。该cursor对象用于执行SELECT语句。

cur = conn.cursor()

然后,通过调用该execute()方法来执行一条SELECT语句。如果要将值传递给SELECT语句,请在SELECT语句中使用占位符 ( %s) ,并在调用execute()方法时绑定输入值,如下所示。

cur.execute(sql, (value1,value2))

之后,使用 fetchone()fetchall()、 或 fetchmany()方法处理存储过程返回的结果集。

  • fetchone()会获取结果集中的下一行。它会返回单个元组,或者在没有更多行可用时返回None
  • fetchmany(size=cursor.arraysize)会获取size参数指定的下一组行。如果省略此参数, arraysize的值将决定要获取的行数。该 fetchmany()方法会返回元组列表,如果没有更多可用行,则返回空列表。
  • fetchall()会获取结果集中的所有行并返回元组列表。如果没有要获取的行,该fetchall()方法将返回一个空列表。

最后,通过调用cursorconnection对象的close()方法,关闭与 PostgreSQL 的通信

cur.close()
conn.close()

使用 fetchone() 方法查询数据

对于演示,我们将使用我们在创建表教程中创建的suppliers数据库中的partsvendorsvendor_parts

PostgreSQL Python Sample Database Diagram

以下get_vendor()函数从vendors表中查询数据,并使用fetchone()方法获取行 。

def get_vendors():
    """ query data from the vendors table """
    conn = None
    try:
        params = config()
        conn = psycopg2.connect(**params)
        cur = conn.cursor()
        cur.execute("SELECT vendor_id, vendor_name FROM vendors ORDER BY vendor_name")
        print("The number of parts: ", cur.rowcount)
        row = cur.fetchone()

        while row is not None:
            print(row)
            row = cur.fetchone()

        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

下面显示了该get_vendors()函数的输出。

if __name__ == '__main__':
    get_vendors()
The number of parts:  7
(1, '3M Corp')
(2, 'AKM Semiconductor Inc.')
(3, 'Asahi Glass Co Ltd.')
(4, 'Daikin Industries Ltd.')
(5, 'Dynacast International Inc.')
(6, 'Foster Electric Co. Ltd.')
(7, 'Murata Manufacturing Co. Ltd.')

使用 fetchall() 方法查询数据

以下get_parts()函数使用游标对象的fetchall()方法从结果集中获取行并显示parts表中的所有零件。

def get_parts():
    """ query parts from the parts table """
    conn = None
    try:
        params = config()
        conn = psycopg2.connect(**params)
        cur = conn.cursor()
        cur.execute("SELECT part_id, part_name FROM parts ORDER BY part_name")
        rows = cur.fetchall()
        print("The number of parts: ", cur.rowcount)
        for row in rows:
            print(row)
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

if __name__ == '__main__':
    get_parts()
The number of parts:  6
(4, 'Antenna')
(5, 'Home Button')
(6, 'LTE Modem')
(1, 'SIM Tray')
(2, 'Speaker')
(3, 'Vibrator')

使用 fetchmany() 方法查询数据

以下get_suppliers()函数使用fetchmany()方法查询零件和供应商数据。

def iter_row(cursor, size=10):
    while True:
        rows = cursor.fetchmany(size)
        if not rows:
            break
        for row in rows:
            yield row

def get_part_vendors():
    """ query part and vendor data from multiple tables"""
    conn = None
    try:
        params = config()
        conn = psycopg2.connect(**params)
        cur = conn.cursor()
        cur.execute("""
            SELECT part_name, vendor_name
            FROM parts
            INNER JOIN vendor_parts ON vendor_parts.part_id = parts.part_id
            INNER JOIN vendors ON vendors.vendor_id = vendor_parts.vendor_id
            ORDER BY part_name;
        """)
        for row in iter_row(cur, 10):
            print(row)
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

if __name__ == '__main__':
    get_part_vendors()
('Antenna', 'Foster Electric Co. Ltd.')
('Antenna', 'Murata Manufacturing Co. Ltd.')
('Home Button', 'Dynacast International Inc.')
('Home Button', '3M Corp')
('LTE Modem', 'Dynacast International Inc.')
('LTE Modem', '3M Corp')
('SIM Tray', 'AKM Semiconductor Inc.')
('SIM Tray', '3M Corp')
('Speaker', 'Daikin Industries Ltd.')
('Speaker', 'Asahi Glass Co Ltd.')
('Vibrator', 'Dynacast International Inc.')
('Vibrator', 'Foster Electric Co. Ltd.')

在本教程中,我们向您展示了在 Python 中使用fetchone()fetchall()fetchmany()方法,从 PostgreSQL 表中查询数据的各种方法。