Получение данных из таблицы PosgreSQL

В этом руководстве разберем, как выполнять запрос SELECT в базе данных PostgreSQL, используя приложение на Python и Psycopg2. Также разберем, как обрабатывать и использовать результат, возвращаемый запросом.

Цели:

  • Получить все строки из базы данных PostgreSQL с помощью fetchall() и ограниченное количество записей, используя fetchmany() и fetchone().
  • Использовать переменные Python в операторе where для передачи динамических значений.

Подготовка

Перед началом работы нужно убедиться, что у вас есть следующее:

  • Имя пользователя и пароль для подключения к PostgreSQL
  • Название базы данных, из которой требуется получить данные

В этом материале воспользуемся таблицей «mobile», которая была создана в первом руководстве по работе с PostgreSQL в Python. Если таблицы нет, то ее нужно создать.

Шаги для выполнения запроса SELECT из Python-программы

  1. Установить psycopg2 с помощью pip.
  2. Создать соединение с базой данных PostgreSQL.
  3. Создать инструкцию с запросом SELECT для получения данных из таблицы PostgreSQL.
  4. Выполнить запрос с помощью cursor.execute() и получить результат.
  5. Выполнить итерацию по объекту с помощью цикла и получить значения всех полей (колонок) базы данных для каждой строки.
  6. Закрыть объекты cursor и connection.
  7. Перехватить любые SQL-исключения, которые могут произойти в процессе.

Запить тестовых данных

Запишем несколько строк в базу данных, что бы потренироваться их получать.


import psycopg2
from psycopg2 import Error

try:
# Подключиться к существующей базе данных
connection = psycopg2.connect(user="postgres",
# пароль, который указали при установке PostgreSQL
password="1111",
host="127.0.0.1",
port="5432",
database="postgres_db")

cursor = connection.cursor()
# Выполнение SQL-запроса для вставки данных в таблицу
insert_query = """ INSERT INTO mobile (ID, MODEL, PRICE) VALUES
(1, 'IPhone 12', 1000),
(2, 'Google Pixel 2', 700),
(3, 'Samsung Galaxy S21', 900),
(4, 'Nokia', 800)"""
cursor.execute(insert_query)
connection.commit()

except (Exception, Error) as error:
print("Ошибка при работе с PostgreSQL", error)
finally:
if connection:
cursor.close()
connection.close()
print("Соединение с PostgreSQL закрыто")

Пример получения данных с помощью fetchall()

В этом примере рассмотрим, как получить все строки из таблицы:


import psycopg2
from psycopg2 import Error

try:
# Подключиться к существующей базе данных
connection = psycopg2.connect(user="postgres",
# пароль, который указали при установке PostgreSQL
password="1111",
host="127.0.0.1",
port="5432",
database="postgres_db")

cursor = connection.cursor()
postgreSQL_select_Query = "select * from mobile"

cursor.execute(postgreSQL_select_Query)
print("Выбор строк из таблицы mobile с помощью cursor.fetchall")
mobile_records = cursor.fetchall()


print("Вывод каждой строки и ее столбцов")
for row in mobile_records:
print("Id =", row[0], )
print("Модель =", row[1])
print("Цена =", row[2], "\n")

except (Exception, Error) as error:
print("Ошибка при работе с PostgreSQL", error)
finally:
if connection:
cursor.close()
connection.close()
print("Соединение с PostgreSQL закрыто")

Вывод:

Выбор строк из таблицы mobile с помощью cursor.fetchall
Вывод каждой строки и ее столбцов
Id = 1
Модель = IPhone 12
Цена = 1000.0 

Id = 2
Модель = Google Pixel 2
Цена = 700.0 

Id = 3
Модель = Samsung Galaxy S21
Цена = 900.0 

Id = 4
Модель = Nokia
Цена = 800.0 

Соединение с PostgreSQL закрыто

Примечание: в этом примере использовалась команда cursor.fetchall() для получения всех строк из базы данных.

Используйте cursor.execute() для выполнения запроса:

  • cursor.fetchall() — для всех строк.
  • cursor.fetchone() — для одной.
  • cursor.fetchmany(SIZE) — для определенного количества.

Передача переменных Python в качестве параметров запроса

В большинстве случаев требуется передавать переменные Python в запросы SQL для получения нужного результата. Например, приложение может передать ID пользователя для получения подробностей о нем из базы данных. Для этого требуется использовать запрос с параметрами.

Запрос с параметрами — это такой запрос, где применяются заполнители (%s) на месте параметров, а значения подставляются уже во время работы программы. Таким образом эти запросы компилируются всего один раз.


import psycopg2
from psycopg2 import Error

def get_mobile_details(mobile_id):
try:
# Подключиться к существующей базе данных
connection = psycopg2.connect(user="postgres",
# пароль, который указали при установке PostgreSQL
password="1111",
host="127.0.0.1",
port="5432",
database="postgres_db")

cursor = connection.cursor()
postgresql_select_query = "select * from mobile where id = %s"

cursor.execute(postgresql_select_query, (mobile_id,))
mobile_records = cursor.fetchall()
for row in mobile_records:
print("Id =", row[0], )
print("Модель =", row[1])
print("Цена =", row[2])

except (Exception, Error) as error:
print("Ошибка при работе с PostgreSQL", error)
finally:
if connection:
cursor.close()
connection.close()
print("Соединение с PostgreSQL закрыто")

get_mobile_details(2)
get_mobile_details(3)

Вывод:

Id = 2
Модель = Google Pixel 2
Цена = 700.0
Соединение с PostgreSQL закрыто
Id = 3
Модель = Samsung Galaxy S21
Цена = 900.0
Соединение с PostgreSQL закрыто

Получение определенного количества строк

Если таблица содержит тысячи строк, то получение всех из них может занять много времени. Но существует альтернатива в виде cursor.fetchmany().

Вот ее синтаксис:

cursor.fetchmany([size=cursor.arraysize])
  • size — это количество строк, которые требуется получить.
  • этот метод делает запрос на определенное количество строк из результата запроса. fetchmany() возвращает список кортежей, содержащих строки.
  • fetchmany() возвращает пустой список, если строки не были найдены. Количество строк зависит от аргумента SIZE. Ошибка ProgrammingError возникает в том случае, если предыдущий вызов execute() не дал никаких результатов.

fetchmany() вернет меньше строк, если в таблице их меньше, чем было указано в аргументе SIZE.

Пример получения ограниченного количества строк из таблицы PostgreSQL с помощью cursor.fetchmany():


import psycopg2
from psycopg2 import Error

try:
# Подключиться к существующей базе данных
connection = psycopg2.connect(user="postgres",
# пароль, который указали при установке PostgreSQL
password="1111",
host="127.0.0.1",
port="5432",
database="postgres_db")

cursor = connection.cursor()
postgresql_select_query = "select * from mobile"

cursor.execute(postgresql_select_query)
mobile_records = cursor.fetchmany(2)

print("Вывод двух строк")
for row in mobile_records:
print("Id =", row[0], )
print("Модель =", row[1])
print("Цена =", row[2], "\n")

mobile_records = cursor.fetchmany(2)

print("Вывод следующих двух строк")
for row in mobile_records:
print("Id =", row[0], )
print("Модель =", row[1])
print("Цена =", row[2], "\n")

except (Exception, Error) as error:
print("Ошибка при работе с PostgreSQL", error)
finally:
if connection:
cursor.close()
connection.close()
print("Соединение с PostgreSQL закрыто")

Вывод:

Вывод двух строк
Id = 1
Модель = IPhone 12
Цена = 1000.0 

Id = 2
Модель = Google Pixel 2
Цена = 700.0 

Вывод следующих двух строк
Id = 3
Модель = Samsung Galaxy S21
Цена = 900.0 

Id = 4
Модель = Nokia
Цена = 800.0 

Соединение с PostgreSQL закрыто

Использование cursor.fetchone

  • Используйте cursor.fetchone() для получения одной строки из таблицы PostgreSQL.
  • Также можно использовать этот же метод для получения следующей строки из результатов запроса.
  • Он может вернуть и none, если в результате не оказалось записей
  • cursor.fetchall() и fetchmany() внутри также используют этот метод.

Пример получения одной строки из базы данных PostgreSQL:


import psycopg2
from psycopg2 import Error

try:
# Подключиться к существующей базе данных
connection = psycopg2.connect(user="postgres",
# пароль, который указали при установке PostgreSQL
password="1111",
host="127.0.0.1",
port="5432",
database="postgres_db")

cursor = connection.cursor()
postgresql_select_query = "select * from mobile"

cursor.execute(postgresql_select_query)

mobile_records_one = cursor.fetchone()
print ("Вывод первой записи", mobile_records_one)

mobile_records_two = cursor.fetchone()
print("Вывод второй записи", mobile_records_two)

except (Exception, Error) as error:
print("Ошибка при работе с PostgreSQL", error)
finally:
if connection:
cursor.close()
connection.close()
print("Соединение с PostgreSQL закрыто")
Вывод первой записи (1, 'IPhone 12', 1000.0)
Вывод второй записи (2, 'Google Pixel 2', 700.0)
Соединение с PostgreSQL закрыто

Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: Почта
admin@pythonru.comAlex Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScript