Для получения данных применяется 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 можно разложить на отдельные значения)