📜  PostgreSQL Python – 查询数据

📅  最后修改于: 2022-05-13 01:54:32.716000             🧑  作者: Mango

PostgreSQL Python – 查询数据

在本文中,我们将看到如何使用Python的pyscopg2 使用 PostSQL 来执行查询数据。

使用Python建立与 PostgreSQL 服务器的连接:

为了建立到 PostgreSQL 服务器的连接,我们将使用Python中的 pscopg2 库。您可以使用以下命令安装 psycopg2:

pip install psycopg2

如果上述命令导致错误,则使用以下命令:

pip uninstall psycopg2
pip install psycopg2-binary

安装库后,可以使用以下代码创建与数据库服务器的连接:

Python
import psycopg2
  
def get_connection():
    try:
        return psycopg2.connect(
            database="postgres",
            user="postgres",
            password="password",
            host="127.0.0.1",
            port=5432,
        )
    except:
        return False
  
conn = get_connection()
  
if conn:
    print("Connection to the PostgreSQL established successfully.")
else:
    print("Connection to the PostgreSQL encountered and error.")


Python
# This program uses fetchall()
# to query all the records from a table
  
# GET THE CONNECTION OBJECT
conn = get_connection()
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE SQL QUERY
curr.execute("SELECT * FROM students;")
  
# FETCH ALL THE ROWS FROM THE CURSOR
data = curr.fetchall()
  
# PRINT THE RECORDS
for row in data:
    print(row)
  
# CLOSE THE CONNECTION
conn.close()


Python
# This program uses fetchone() to
# query one by one record from a table
  
# GET THE CONNECTION OBJECT
conn = get_connection()
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE SQL QUERY
curr.execute("SELECT * FROM students;")
  
# FETCH THE FIRST ROW FROM THE CURSOR
data1 = curr.fetchone()
print(data1)
  
# FETCH THE SECOND ROW FROM THE CURSOR
data2 = curr.fetchone()
print(data2)
  
# CLOSE THE CONNECTION
conn.close()


Python
# This program uses fetchmany() 
# to query specified number of records from a table
  
# GET THE CONNECTION OBJECT
conn = get_connection()
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE SQL QUERY
curr.execute("SELECT * FROM students;")
  
print("First two records:")
  
# GET FIRST TWO RECORDS FROM DATABASE TABLE
data1 = curr.fetchmany(2)
for row in data1:
    print(row)
  
print("Next three records:")
  
# GET NEXT THREE RECORDS FROM DATABASE TABLE
data2 = curr.fetchmany(3)
for row in data2:
    print(row)
  
# CLOSE THE CONNECTION
conn.close()


输出:

Connection to the PostgreSQL established successfully.

如果提供的数据库凭据正确且连接成功,则运行上述代码将产生以下结果:

使用 psycopg2 查询数据

让我们看看如何使用 psycopg2 库查询数据。

执行原始 SQL 查询

执行以下 SQL 查询以在我们的表中准备好数据,以便从以下位置查询数据:

在上面的输出中,我们可以看到学生表中有 5 条记录。我们将利用这些记录来了解如何从数据库表中查询数据。

示例 1:使用 fetchall() 查询数据

Python

# This program uses fetchall()
# to query all the records from a table
  
# GET THE CONNECTION OBJECT
conn = get_connection()
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE SQL QUERY
curr.execute("SELECT * FROM students;")
  
# FETCH ALL THE ROWS FROM THE CURSOR
data = curr.fetchall()
  
# PRINT THE RECORDS
for row in data:
    print(row)
  
# CLOSE THE CONNECTION
conn.close()

输出:



fetchall() 的输出

在上面的代码中,我们使用SELECT * FROM Students 创建了一个连接和查询,它获取了 Students 表的整个转储。为了查询Python代码中的数据,我们可以使用fetchall()。 fetchall()方法获取我们从 SQL 查询(在本例中为 SELECT 查询)中获得的所有记录,并在列表中提供它们。该列表由元组组成,其中每个元组由特定记录或行中存在的所有列值组成。

示例 2:使用 fetchone() 查询数据

Python

# This program uses fetchone() to
# query one by one record from a table
  
# GET THE CONNECTION OBJECT
conn = get_connection()
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE SQL QUERY
curr.execute("SELECT * FROM students;")
  
# FETCH THE FIRST ROW FROM THE CURSOR
data1 = curr.fetchone()
print(data1)
  
# FETCH THE SECOND ROW FROM THE CURSOR
data2 = curr.fetchone()
print(data2)
  
# CLOSE THE CONNECTION
conn.close()

输出:

fetchone() 的输出

不要fetchone()方法与它只查询第一行的想法混淆。 fetchone()方法从我们从存在于curr.execute()方法中的 SQL 查询中获得的转储中返回第一条记录。它的行为就像一个队列,我们在其中查询第一条记录,然后将其从游标对象中删除。现在,如果我们再次尝试使用fetchone()方法,它将返回下一条记录。上面的代码演示了我们获取第一条记录,然后再次使用fetchone()方法获取队列中的下一条记录的情况。我们可以继续这样做,直到到达游标对象中的最后一条记录。

示例 3:使用 fetchmany() 查询数据

Python

# This program uses fetchmany() 
# to query specified number of records from a table
  
# GET THE CONNECTION OBJECT
conn = get_connection()
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE SQL QUERY
curr.execute("SELECT * FROM students;")
  
print("First two records:")
  
# GET FIRST TWO RECORDS FROM DATABASE TABLE
data1 = curr.fetchmany(2)
for row in data1:
    print(row)
  
print("Next three records:")
  
# GET NEXT THREE RECORDS FROM DATABASE TABLE
data2 = curr.fetchmany(3)
for row in data2:
    print(row)
  
# CLOSE THE CONNECTION
conn.close()

输出:

fetchmany() 的输出

我们已经看到了如何查询所有记录以及如何查询一条记录。 fetchmany()方法接受了编号。我们要从整个转储中获取的记录数。正如我们在fetchone()方法中看到的那样,它的行为也像一个队列,除了它一次可以获取多个记录的事实。但是,使用fetchmany(1)等同于使用fetchone()方法。在上面的代码中,我们使用fetchmany(2)查询前两条记录,然后使用fetchmany(3)查询接下来的 3 条记录。在下面的输出中可以注意到同样的情况。