В этом руководстве разберем, как выполнять запрос SELECT в базе данных PostgreSQL, используя приложение на Python и Psycopg2. Также разберем, как обрабатывать и использовать результат, возвращаемый запросом.
Цели:
- Получить все строки из базы данных PostgreSQL с помощью
fetchall()
и ограниченное количество записей, используяfetchmany()
иfetchone()
. - Использовать переменные Python в операторе
where
для передачи динамических значений.
Подготовка
Перед началом работы нужно убедиться, что у вас есть следующее:
- Имя пользователя и пароль для подключения к PostgreSQL
- Название базы данных, из которой требуется получить данные
В этом материале воспользуемся таблицей «mobile», которая была создана в первом руководстве по работе с PostgreSQL в Python. Если таблицы нет, то ее нужно создать.
Шаги для выполнения запроса SELECT из Python-программы
- Установить psycopg2 с помощью pip.
- Создать соединение с базой данных PostgreSQL.
- Создать инструкцию с запросом SELECT для получения данных из таблицы PostgreSQL.
- Выполнить запрос с помощью
cursor.execute()
и получить результат. - Выполнить итерацию по объекту с помощью цикла и получить значения всех полей (колонок) базы данных для каждой строки.
- Закрыть объекты cursor и connection.
- Перехватить любые 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 закрыто