Рассказываем, как работать с PostgreSQL в Python и почему для этого мы используем именно модуль Psycopg2.
Во время разработки приложений часто нужно подключать и использовать базы данных для хранения информации. Самая распространенная база данных — PostgreSQL, поэтому мы расскажем, как работать в Python именно с ней. Для этого существует множество модулей, например:
- Psycopg2
- py-postgresql
- pg8000
Мы расскажем именно про модуль Psycopg2. И выбрали мы его по таким причинам:
- Распространенность — Psycopg2 использует большинство фреймворков Python
- Поддержка — Psycopg2 активно развивается и поддерживает основные версии Python
- Многопоточность — Psycopg2 позволяет нескольким потокам поддерживать одно и то же соединение
- Постоянная поддержка от наставника и учебного центра
- Помощь с трудоустройством
- Готовое портфолио к концу обучения
- Практика с первого урока
Вы получите именно те инструменты и навыки, которые позволят вам найти работу
Узнать большеУстановка Psycopg2
Для начала работы с модулем достаточно установить пакет при помощи pip:
pip install psycopg2-binary
Если в вашем проекте используется poetry, то при первоначальной настройке проекта нужно добавить psycopg2-binary
в зависимости. Для добавления в уже существующий проект воспользуйтесь командой:
poetry add psycopg2-binary
Использование Psycopg2
Подключение к БД:
Для подключения к существующей базе данных необходимо знать основную информацию о вашей БД. Если вы не знаете, где ее взять, то пройдите сначала наш большой курс по Основам баз данных:
- Username — имя пользователя, которое вы используете для работы с PostgreSQL
- Password — пароль, который используется пользователем
- Host Name — имя сервера или IP-адрес, на котором работает PostgreSQL
- Database Name — имя базы данных, к которой мы подключаемся.
Для подключения к базе данных мы используем метод connect()
, которому в качестве аргументов передаются вышеперечисленные данные:
import psycopg2
try:
# пытаемся подключиться к базе данных
conn = psycopg2.connect(dbname='test', user='postgres', password='secret', host='host')
except:
# в случае сбоя подключения будет выведено сообщение в STDOUT
print('Can`t establish connection to database')
Также подключение к базе данных может осуществляться с помощью Connection URI:
import psycopg2
try:
# пытаемся подключиться к базе данных
conn = psycopg2.connect('postgresql://user:password@host:port/database_name')
except:
# в случае сбоя подключения будет выведено сообщение в STDOUT
print('Can`t establish connection to database')
Читайте также: Вышел Python 3.11.0. В два раза быстрее, c детальным описанием ошибок и кучей новых типов
Взаимодействие Python с PostgreSQL
Итак, подключение к базе данных успешно выполнено. Дальше мы будем взаимодействовать с ней через объект cursor
, который можно получить через метод cursor()
объекта соединения. Он помогает выполнять SQL-запросы из Python.
# получение объекта курсора
cursor = conn.cursor()
С помощью cursor
происходит передача запросов базе данных:
# Получаем список всех пользователей
cursor.execute('SELECT * FROM users')
all_users = cursor.fetchall()
cursor.close() # закрываем курсор
conn.close() # закрываем соединение
Для получения результата после выполнения запроса используются следующие команды:
cursor.fetchone()
— вернуть одну строкуcursor.fetchall()
— вернуть все строкиcursor.fetchmany(size=10)
— вернуть указанное количество строк
Хорошей практикой при работе с базой данных является закрытие объекта cursor
и соединения с базой. Для автоматизации этого процесса удобно взаимодействовать через контекстный менеджер, используя конструкцию with
:
with conn.cursor as curs:
curs.execute('SELECT * FROM users')
all_users = curs.fetchall()
В тот момент, когда объект cursor
выходит за пределы конструкции with
, происходит его закрытие и освобождение связанных с ним ресурсов.
По умолчанию результат возвращается в виде кортежа. Такое поведение возможно изменить, передав параметр cursor_factory
в момент открытия объекта cursor
, например, использовать NamedTupleCursor.
Это вернет данные в виде именованного кортежа:
from psycopg2.extras import NamedTupleCursor
# …
with conn.cursor(cursor_factory=NamedTupleCursor) as curs:
curs.execute('SELECT * FROM users WHERE name=%s', (name='Alfred'))
alfred = curs.fetchone()
alfred # (id=10, name='Alfred', age='90')
# …
Выполнение запросов
Psycopg2 преобразует переменные Python в SQL значения с учетом их типа. Все стандартные типы Python адаптированы для правильного представления в SQL.
Передача параметров в SQL-запрос происходит с помощью подстановки плейсхолдеров %s
и цепочки значений в качестве второго аргумента функции:
with conn.cursor() as curs:
curs.execute('SELECT id, name FROM users WHERE name=%s', ('John',))
curs.fetchall()
# …
with conn.cursor() as curs:
curs.execute(INSERT INTO users (name, age) VALUES (%s, %s), ('John', 19))
# …
conn.close()
Подстановка значений в SQL-запрос используется для того, чтобы избежать атак типа SQL Injection. Также несколько полезных советов по построению запросов:
- Плейсхолдер должен быть
%s
даже если тип подставляемого значения отличается от строки - Не заключайте плейсходер в кавычки
- Если в запросе используется знак
%
, он должен быть указан как%%
- Изучите Python — язык с простым и понятным синтаксисом
- Научитесь создавать полноценные сайты и веб-приложения
- Освойте популярный фреймворк Python — Django
- Разберитесь в базах данных и научитесь управлять ими с помощью SQL