Psycopg2 – драйвер PostgreSQL

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

PostgreSQL — это мощная реляционная СУБД с открытым исходным кодом, известная своей надёжностью, масштабируемостью и поддержкой сложных типов данных. Чтобы работать с ней из Python, самым популярным инструментом является Psycopg2 — официальный синхронный драйвер для PostgreSQL.

Psycopg2 – драйвер PostgreSQL предоставляет стабильное и производительное решение для подключения, выполнения SQL-запросов, управления транзакциями и интеграции с веб-фреймворками.

Установка и подключение к базе

Установка

bash
pip install psycopg2-binary

Подключение к PostgreSQL

python
import psycopg2 conn = psycopg2.connect( dbname="mydb", user="postgres", password="password", host="localhost", port="5432" )

Создание курсора:

python
cur = conn.cursor()

Создание базы данных и таблиц

python
cur.execute(""" CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL ) """) conn.commit()

CRUD-операции с Psycopg2

Добавление записи

python
cur.execute("INSERT INTO users (name, email) VALUES (%s, %s)", ("Иван", "ivan@example.com")) conn.commit()

Выборка данных

python
cur.execute("SELECT * FROM users") rows = cur.fetchall() for row in rows: print(row)

Обновление и удаление

python
cur.execute("UPDATE users SET email=%s WHERE id=%s", ("new@example.com", 1)) cur.execute("DELETE FROM users WHERE id=%s", (1,)) conn.commit()

Курсоры и работа с транзакциями

Psycopg2 по умолчанию использует транзакции. Изменения нужно коммитить вручную:

python
try: with conn: with conn.cursor() as cur: cur.execute(...) except Exception: conn.rollback()

Чтение результатов запросов

  • fetchone() — получить одну строку

  • fetchmany(n) — получить n строк

  • fetchall() — получить все строки

Также можно перебирать курсор напрямую:

python
for row in cur: print(row)

Безопасность и защита от SQL-инъекций

python
cur.execute("SELECT * FROM users WHERE email = %s", ("ivan@example.com",))

Никогда не используйте f-строки или .format() для SQL-запросов.

Работа с типами данных PostgreSQL

Psycopg2 поддерживает:

  • JSON → автоматически преобразуется в Python-словарь

  • UUID

  • Timestamp

  • Массивы (списки)

  • Decimal

Пример с JSON:

python
cur.execute("INSERT INTO logs (metadata) VALUES (%s)", (json.dumps({"ip": "127.0.0.1"}),))

Интеграция с Pandas, Flask и Django

Pandas

python
import pandas as pd df = pd.read_sql("SELECT * FROM users", conn)

Flask

python
from flask import Flask app = Flask(__name__) @app.route('/') def index(): cur.execute("SELECT COUNT(*) FROM users") count = cur.fetchone()[0] return f"Всего пользователей: {count}"

Django

Django использует psycopg2 по умолчанию для PostgreSQL:

python
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', ... } }

Сравнение с другими драйверами PostgreSQL

Драйвер Асинхронность Скорость Поддержка ORM Уровень управления
Psycopg2 Нет Высокая SQLAlchemy, Django Полный контроль
asyncpg Да Очень высокая Ограниченно Асинхронный API
aiopg Да Средняя Ограниченно Асинхронный API
psycopg3 Да (новая версия) Высокая Да Асинхронность встроена

Тестирование и отладка

  • Используйте отдельную тестовую базу

  • Очистка таблиц перед тестом:

python
cur.execute("TRUNCATE users RESTART IDENTITY CASCADE")
  • Логируйте SQL-запросы для отладки

  • Используйте фикстуры с pytest или unittest

Асинхронная альтернатива (psycopg3)

Psycopg3 — новая версия с поддержкой асинхронных API через await:

python
import psycopg async with await psycopg.AsyncConnection.connect(...) as conn: async with conn.cursor() as cur: await cur.execute(...)

Подходит для проектов на FastAPI и других async-фреймворках.

Работа с большими объёмами данных

Для обработки большого количества строк:

python
cur.execute("SELECT * FROM big_table") while row := cur.fetchone(): process(row)

Или использовать server-side курсор:

python
cur = conn.cursor(name="stream_cursor") cur.execute("SELECT * FROM big_table") for row in cur: ...

Часто задаваемые вопросы (FAQ)

1. Что такое psycopg2?
Это синхронный драйвер для подключения и работы с PostgreSQL в Python.

2. Поддерживает ли psycopg2 транзакции?
Да, полностью. Вы можете управлять commit() и rollback().

3. Как обезопасить SQL-запросы?
Используйте параметризацию: execute(sql, params).

4. Можно ли использовать psycopg2 с Django?
Да, это рекомендуемый драйвер PostgreSQL для Django.

5. Есть ли поддержка асинхронности?
Нет, используйте psycopg3 или asyncpg для async-приложений.

6. Работает ли psycopg2 с Pandas?
Да, через read_sql() и to_sql() с SQLAlchemy.

Полный справочник по ключевым функциям и модулям библиотеки Psycopg2 для Python

Установка

bash
pip install psycopg2-binary

Или (если нужна сборка с исходников):

bash
pip install psycopg2

Подключение к базе данных

Функция Описание
psycopg2.connect(...) Создаёт соединение с базой данных PostgreSQL.
python
import psycopg2 conn = psycopg2.connect( dbname="mydb", user="postgres", password="secret", host="localhost", port=5432 ) cursor = conn.cursor()

Выполнение SQL-запросов

Метод Описание
cursor.execute(sql, params) Выполняет SQL-запрос с параметрами.
cursor.executemany(sql, list_of_params) Повторяет запрос для списка параметров.
cursor.callproc(procname, args) Вызов хранимой процедуры.
python
cursor.execute("SELECT * FROM users WHERE age > %s", (18,))

Получение данных

Метод Описание
cursor.fetchone() Получает одну строку.
cursor.fetchall() Получает все строки.
cursor.fetchmany(size) Получает size строк.
for row in cursor: Итерация по результату.

Работа с транзакциями

Метод Описание
conn.commit() Подтверждение транзакции.
conn.rollback() Откат транзакции.
conn.autocommit = True Автоматическая фиксация транзакций.

Закрытие соединений

Метод Описание
cursor.close() Закрывает курсор.
conn.close() Закрывает соединение.

Параметры запроса

Синтаксис Описание
%s Стандартный плейсхолдер для значений.
cursor.execute("SELECT * FROM users WHERE name=%s", ("Ваня",)) Пример безопасной подстановки.

Использование с контекстными менеджерами

python
with psycopg2.connect(...) as conn: with conn.cursor() as cursor: cursor.execute("SELECT * FROM users")

Использование словарей (DictCursor)

python
import psycopg2.extras conn = psycopg2.connect(...) cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) cursor.execute("SELECT * FROM users") row = cursor.fetchone() print(row["name"])

Работа с типами данных

Тип PostgreSQL Тип Python
INTEGER int
TEXT str
BOOLEAN bool
TIMESTAMP datetime
JSON / JSONB dict/list
BYTEA bytes

Работа с JSON

python
import json cursor.execute("INSERT INTO logs (data) VALUES (%s)", (json.dumps({"msg": "ok"}),))

Или использовать тип psycopg2.extras.Json:

python
from psycopg2.extras import Json cursor.execute("INSERT INTO logs (data) VALUES (%s)", (Json({"msg": "ok"}),))

Массовые вставки (bulk insert)

python
cursor.executemany("INSERT INTO users (name, age) VALUES (%s, %s)", [ ("Ваня", 25), ("Оля", 23) ])

Или более эффективно:

python
from psycopg2.extras import execute_values execute_values(cursor, "INSERT INTO users (name, age) VALUES %s", [ ("Ваня", 25), ("Оля", 23) ])

Работа с расширениями PostgreSQL

python
cursor.execute("CREATE EXTENSION IF NOT EXISTS hstore")

Работа с временными таблицами

python
cursor.execute("CREATE TEMP TABLE temp_users (id INT, name TEXT)")

Обработка ошибок

Исключение Описание
psycopg2.Error Базовое исключение.
OperationalError Ошибка подключения или транзакции.
ProgrammingError Ошибка SQL-синтаксиса.
IntegrityError Нарушение ограничений (уникальность, внешний ключ).
python
try: cursor.execute("...")