Для подключения к базе данных PostgreSQL в Python чаще всего используется библиотека Psycopg2. Она является наиболее популярным и функциональным адаптером базы данных PostgreSQL для Python, соответствующим стандарту DB-API 2.0.
Вот пошаговое руководство и примеры использования psycopg2.
1. Установка Psycopg2
Прежде чем начать, вам нужно установить библиотеку psycopg2.
Bash
Pip install psycopg2-binary
Используйте psycopg2-binary, если вы не хотите компилировать библиотеку из исходного кода, так как она включает уже скомпилированные бинарники. Если у вас возникнут проблемы, можно попробовать pip install psycopg2.
2. Подключение к базе данных
Для подключения используется функция psycopg2.connect(). Ей передаются параметры подключения в виде ключевых аргументов.
Основные параметры подключения:
host: IP-адрес или доменное имя сервера базы данных (например, ‘localhost’ или ‘127.0.0.1’). database (или dbname): Имя базы данных, к которой вы хотите подключиться. user: Имя пользователя для подключения. password: Пароль пользователя. port: Номер порта, на котором PostgreSQL слушает соединения (по умолчанию 5432).
Пример кода для подключения:
Python
Import psycopg2
From psycopg2 import Error
# Параметры подключения к базе данных
DB_HOST = "localhost"
DB_NAME = "your_database_name" # Замените на имя вашей БД
DB_USER = "your_username" # Замените на ваше имя пользователя
DB_PASSWORD = "your_password" # Замените на ваш пароль
DB_PORT = "5432" # Стандартный порт PostgreSQL
Connection = None # Инициализируем переменную для соединения
Try:
# Устанавливаем соединение с базой данных
connection = psycopg2.connect(
host=DB_HOST,
database=DB_NAME,
user=DB_USER,
password=DB_PASSWORD,
port=DB_PORT
)
# Создаем объект курсора
# Курсор позволяет выполнять SQL-запросы
cursor = connection. cursor()
# Если соединение успешно, вы увидите это сообщение
print("Успешное подключение к базе данных PostgreSQL")
# Здесь можно выполнять SQL-запросы
# …
Except Error as err:
print(f"Ошибка при подключении к PostgreSQL: {err}")
Finally:
# Закрываем соединение и курсор в блоке finally,
# чтобы гарантировать их закрытие даже в случае ошибки
if connection:
cursor. close()
connection. close()
print("Соединение с PostgreSQL закрыто")
3. Выполнение SQL-запросов (CRUD-операции)
После успешного подключения вы используете объект cursor для выполнения SQL-запросов.
А) Создание таблицы (CREATE TABLE)
Python
Import psycopg2
From psycopg2 import Error
# … (параметры подключения и блок try-except-finally как выше)
Connection = None
Try:
connection = psycopg2.connect(
host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD, port=DB_PORT
)
cursor = connection. cursor()
create_table_query = """
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
"""
cursor. execute(create_table_query)
connection. commit() # Подтверждаем изменения
print("Таблица ‘users’ успешно создана или уже существует.")
Except Error as err:
print(f"Ошибка при создании таблицы: {err}")
Finally:
if connection:
cursor. close()
connection. close()
Б) Вставка данных (INSERT)
Всегда используйте параметризованные запросы для вставки данных, чтобы предотвратить SQL-инъекции!
Python
# … (подключение как выше)
Connection = None
Try:
connection = psycopg2.connect(
host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD, port=DB_PORT
)
cursor = connection. cursor()
insert_query = """
INSERT INTO users (name, email) VALUES (%s, %s);
"""
# Вставка одного пользователя
user_data = ("Иван Петров", "ivan. petrov@example. com")
cursor. execute(insert_query, user_data)
connection. commit()
print("Пользователь ‘Иван Петров’ успешно добавлен.")
# Вставка нескольких пользователей (executemany)
users_to_add = [
("Мария Сидорова", "maria. sidorova@example. com"),
("Алексей Козлов", "alexey. kozlov@example. com")
]
cursor. executemany(insert_query, users_to_add)
connection. commit()
print("Несколько пользователей успешно добавлены.")
Except Error as err:
print(f"Ошибка при вставке данных: {err}")
connection. rollback() # Откатываем изменения в случае ошибки
Finally:
if connection:
cursor. close()
connection. close()
В) Чтение Данных (SELECT)
Python
# … (подключение как выше)
Connection = None
Try:
connection = psycopg2.connect(
host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD, port=DB_PORT
)
cursor = connection. cursor()
select_query = "SELECT id, name, email FROM users;"
cursor. execute(select_query)
# Получить все строки
records = cursor. fetchall()
print("Все пользователи:")
for row in records:
print(f"ID: {row[0]}, Имя: {row[1]}, Email: {row[2]}")
# Получить одну строку
select_single_query = "SELECT name FROM users WHERE email = %s;"
cursor. execute(select_single_query, ("ivan. petrov@example. com",))
single_record = cursor. fetchone()
if single_record:
print(f"\nИмя пользователя с email ‘ivan. petrov@example. com’: {single_record[0]}")
Except Error as err:
print(f"Ошибка при чтении данных: {err}")
Finally:
if connection:
cursor. close()
connection. close()
Г) Обновление данных (UPDATE)
Python
# … (подключение как выше)
Connection = None
Try:
connection = psycopg2.connect(
host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD, port=DB_PORT
)
cursor = connection. cursor()
update_query = """
UPDATE users SET name = %s WHERE email = %s;
"""
cursor. execute(update_query, ("Иван Смирнов", "ivan. petrov@example. com"))
connection. commit()
print("Данные пользователя успешно обновлены.")
Except Error as err:
print(f"Ошибка при обновлении данных: {err}")
connection. rollback()
Finally:
if connection:
cursor. close()
connection. close()
Д) Удаление Данных (DELETE)
Python
# … (подключение как выше)
Connection = None
Try:
connection = psycopg2.connect(
host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD, port=DB_PORT
)
cursor = connection. cursor()
delete_query = """
DELETE FROM users WHERE email = %s;
"""
cursor. execute(delete_query, ("maria. sidorova@example. com",))
connection. commit()
print("Пользователь ‘maria. sidorova@example. com’ успешно удален.")
Except Error as err:
print(f"Ошибка при удалении данных: {err}")
connection. rollback()
Finally:
if connection:
cursor. close()
connection. close()
4. Важные моменты
Connection. commit(): Обязательно вызывайте этот метод после любой операции, которая изменяет базу данных (INSERT, UPDATE, DELETE, CREATE TABLE и т. д.), чтобы сохранить изменения. Если вы забудете commit(), изменения не будут сохранены. Connection. rollback(): Используйте этот метод в блоке except для отката всех изменений, сделанных в текущей транзакции, если произошла ошибка. Это помогает поддерживать целостность данных. Закрытие соединений и курсоров: Всегда закрывайте cursor и connection после завершения работы с ними. Это освобождает ресурсы базы данных. Блок finally идеально подходит для этого. Параметризованные запросы: ВСЕГДА используйте %s (или %() при передаче словаря) для передачи данных в SQL-запросы. Никогда не вставляйте значения напрямую в строку запроса (например, с помощью f-строк), так как это открывает дверь для SQL-инъекций. psycopg2 правильно экранирует данные за вас. Обработка ошибок: Используйте блоки try…except…finally для корректной обработки возможных ошибок подключения или выполнения запросов.
Это базовое руководство должно помочь вам начать работу с PostgreSQL в Python с использованием psycopg2.