PostgreSQL — это мощная объектно-реляционная система управления базами данных (СУБД). Она широко используется благодаря своей надежности, открытости и возможностям адаптации под множество сценариев. Подключение к PostgreSQL через Python позволяет программистам выполнять разнообразные операции с данными напрямую из скриптов или приложений.
В данной статье мы рассмотрим, как сделать это шаг за шагом.
Установка необходимых библиотек
Для начала работы нам потребуется установить PostgreSQL и библиотеку psycopg2
для Python.
PostgreSQL
Чтобы установить PostgreSQL на ваш локальный компьютер, следуйте этим инструкциям:
- Загрузите и запустите установочный пакет PostgreSQL.
- Следуйте инструкциям мастера установки, выберите необходимые компоненты и установите их.
- Проверьте установку, запустив PostgreSQL и авторизовавшись в системе.
- Создайте новую базу данных командой:
createdb mydatabase
Библиотека psycopg2
psycopg2
— это адаптер базы данных PostgreSQL для языка программирования Python. Для его установки используйте pip:
pip install psycopg2-binary
Создание базы данных и таблицы
Подключение к PostgreSQL
Для того чтобы подключиться к базе данных, создайте файл db_connection.py
и добавьте следующий код:
import psycopg2
from typing import Optional
def connect_db(
dbname: str, user: str, password: str, host: str = "localhost", port: int = 5432
) -> Optional[psycopg2.extensions.connection]:
"""
Подключение к базе данных PostgreSQL.
:param dbname: Имя базы данных
:param user: Имя пользователя
:param password: Пароль пользователя
:param host: Адрес сервера
:param port: Порт сервера
:return: Объект подключения к базе данных
"""
try:
conn = psycopg2.connect(
dbname=dbname, user=user, password=password, host=host, port=port
)
return conn
except Exception as e:
print(f"Ошибка подключения к базе данных: {e}")
return None
Создание таблицы
Теперь создадим простую таблицу в PostgreSQL с помощью Python:
def create_table(conn: psycopg2.extensions.connection, table_name: str) -> None:
"""
Создание таблицы в базе данных.
:param conn: Объект подключения к базе данных
:param table_name: Имя таблицы
"""
with conn.cursor() as cur:
cur.execute(f"""
CREATE TABLE IF NOT EXISTS {table_name} (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INT
);
""")
conn.commit()
Основные операции с данными
Вставка данных
Для вставки данных в таблицу используем параметризованный запрос:
def insert_data(
conn: psycopg2.extensions.connection, table_name: str, name: str, age: int
) -> None:
"""
Вставка данных в таблицу.
:param conn: Объект подключения к базе данных
:param table_name: Имя таблицы
:param name: Имя пользователя
:param age: Возраст пользователя
"""
with conn.cursor() as cur:
cur.execute(
f"INSERT INTO {table_name} (name, age) VALUES (%s, %s)", (name, age)
)
conn.commit()
Чтение данных
Выполнение SELECT-запросов и обработка результатов:
def read_data(conn: psycopg2.extensions.connection, table_name: str) -> list:
"""
Чтение данных из таблицы.
:param conn: Объект подключения к базе данных
:param table_name: Имя таблицы
:return: Список записей из базы данных
"""
with conn.cursor() as cur:
cur.execute(f"SELECT * FROM {table_name}")
return cur.fetchall()
Обновление и удаление данных
Примеры кода для обновления и удаления данных:
def update_data(
conn: psycopg2.extensions.connection, table_name: str, user_id: int, new_age: int
) -> None:
"""
Обновление данных в таблице.
:param conn: Объект подключения к базе данных
:param table_name: Имя таблицы
:param user_id: Идентификатор пользователя
:param new_age: Новый возраст пользователя
"""
with conn.cursor() as cur:
cur.execute(
f"UPDATE {table_name} SET age = %s WHERE id = %s", (new_age, user_id)
)
conn.commit()
def delete_data(
conn: psycopg2.extensions.connection, table_name: str, user_id: int
) -> None:
"""
Удаление данных из таблицы.
:param conn: Объект подключения к базе данных
:param table_name: Имя таблицы
:param user_id: Идентификатор пользователя
"""
with conn.cursor() as cur:
cur.execute(f"DELETE FROM {table_name} WHERE id = %s", (user_id,))
conn.commit()
Работа с транзакциями
Транзакции позволяют выполнять несколько операций как единую последовательность. Пример использования транзакций:
def perform_transaction(conn: psycopg2.extensions.connection) -> None:
"""
Выполнение транзакции в базе данных.
:param conn: Объект подключения к базе данных
"""
try:
with conn:
with conn.cursor() as cur:
cur.execute(
"INSERT INTO mytable (name, age) VALUES (%s, %s)", ("User1", 30)
)
cur.execute(
"INSERT INTO mytable (name, age) VALUES (%s, %s)", ("User2", 25)
)
except Exception as e:
print(f"Ошибка выполнения транзакции: {e}")
Типизация данных в Python
Использование аннотации типов в функциях, работающих с PostgreSQL, помогает улучшить читаемость и качество кода. Пример использования типизации мы уже видели в предыдущих функциях.
Обработка ошибок
Примеры обработки ошибок при работе с базой данных:
def safe_query_execution(conn: psycopg2.extensions.connection, query: str) -> None:
"""
Безопасное выполнение запроса к базе данных.
:param conn: Объект подключения к базе данных
:param query: SQL-запрос
"""
try:
with conn.cursor() as cur:
cur.execute(query)
conn.commit()
except Exception as e:
print(f"Ошибка выполнения запроса: {e}")
Заключение
В данной статье мы рассмотрели основные шаги по подключению к PostgreSQL через Python: от установки необходимых библиотек до выполнения CRUD операций и работы с транзакциями. Продолжайте изучать данное направление, используя документацию и материалы из раздела «Дополнительные ресурсы».