Получение данных из БД PostgreSQL

Последнее обновление: 25.11.2022

Для получения данных применяется SQL-команда SELECT. После выполнения этой команды курсор получает данные, которые можно получить с помощью одного из методов: fetchall() (возвращает список со всеми строками), fetchmany() (возвращает указанное количество строк) и fetchone() (возвращает одну в наборе строку). Рассмотрим получение данных на примере следующей таблицы

CREATE TABLE people (id SERIAL PRIMARY KEY, name VARCHAR(50), age INTEGER)
INSERT INTO people (name, age) VALUES ('Tom', 38)
INSERT INTO people (name, age) VALUES ('Bob', 42)
INSERT INTO people (name, age) VALUES ('Sam', 28)
INSERT INTO people (name, age) VALUES ('Alice', 33)
INSERT INTO people (name, age) VALUES ('Kate', 25)

Получение всех строк

Например, получим все ранее добавленные данные из таблицы people:

import psycopg2

conn = psycopg2.connect(dbname="metanit", user="postgres", password="123456", host="127.0.0.1")
cursor = conn.cursor()

# получаем все данные из таблицы people
cursor.execute("SELECT * FROM people")
print(cursor.fetchall())

cursor.close()
conn.close()

При выполнении этой программы на консоль будет выведен список строк, где каждая строка представляет кортеж:

[(1, 'Tom', 38), (2, 'Bob', 42), (3, 'Sam', 28), (4, 'Alice', 33), (5, 'Kate', 25)]

При необходимости мы можем перебрать список, используя стандартные циклические конструкции:

import psycopg2

conn = psycopg2.connect(dbname="metanit", user="postgres", password="123456", host="127.0.0.1")
cursor = conn.cursor()

cursor.execute("SELECT * FROM people")
for person in cursor.fetchall():
    print(f"{person[1]} - {person[2]}")

cursor.close()
conn.close()

Результат работы программы:

Tom - 38
Bob - 42
Sam - 28
Alice - 33
Kate - 25

Стоит отметить, что в примере выше необязательно вызывать метод fetchall, мы можем перебрать курсор в цикле как обычный набор:

for person in cursor:
    print(f"{person[1]} - {person[2]}")

Получение части строк

Получение части строк с помощью метода fetchmany(), в который передается количество строк:

import psycopg2

conn = psycopg2.connect(dbname="metanit", user="postgres", password="123456", host="127.0.0.1")
cursor = conn.cursor()

cursor.execute("SELECT * FROM people")
# извлекаем первые 3 строки в полученном наборе
print(cursor.fetchmany(3))

cursor.close()
conn.close()

Результат работы программы:

[(1, 'Tom', 38), (2, 'Bob', 42), (3, 'Sam', 28)]

Выполнение этого метода извлекает следующие ранее неизвлеченные строки:

# извлекаем первые 3 строки в полученном наборе
print(cursor.fetchmany(3))  # [(1, 'Tom', 38), (2, 'Bob', 42), (3, 'Sam', 28)]
# извлекаем следующие 3 строки в полученном наборе
print(cursor.fetchmany(3))  # [(4, 'Alice', 33), (5, 'Kate', 25)]

Получение одной строки

Метод fetchone() извлекает следующую строку в виде кортежа значений и возвращает его. Если строк больше нет, то возвращает None:

import psycopg2

conn = psycopg2.connect(dbname="metanit", user="postgres", password="123456", host="127.0.0.1")
cursor = conn.cursor()

cursor.execute("SELECT * FROM people")
# извлекаем одну строку
print(cursor.fetchone())    # (1, 'Tom', 38)

cursor.close()
conn.close()

Данный метод удобно применять, когда нам надо извлечь из базы данных только один объект:

import psycopg2;

conn = psycopg2.connect("metanit.db")
cursor = conn.cursor()

cursor.execute("SELECT name, age FROM people WHERE id=2")
# раскладываем кортеж на две переменных
name, age = cursor.fetchone()
print(f"Name: {name}    Age: {age}")    # Name: Bob   Age: 42

Здесь получаем из бд строку с id=2, и полученный результат раскладываем на две переменных name и age (так как кортеж в Python можно разложить на отдельные значения)

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850