Python: SQL
Теория: Стандартный workflow
Перед тем как погружаться в различные аспекты библиотеки Psycopg2, мы рассмотрим общий принцип работы, который будет одинаковым для любых запросов. Он включает в себя следующие пункты:
- Установка зависимостей
- Подключение к базе данных
- Подготовка запроса
- Выполнение запроса
- Формирование результата
В этом курсе мы будем работать с базой данных Postgres.
Установка зависимостей
Для начала работы достаточно установить пакет при помощи uv:
Подключение к БД
Для подключения к существующей базе данных необходимо знать основную информацию о вашей БД.
- Username — имя пользователя, которое вы используете для работы с PostgreSQL.
- Password — пароль, который используется пользователем.
- Host Name — имя сервера или IP-адрес, на котором работает PostgreSQL.
- Database Name — имя базы данных, к которой мы подключаемся.
Для подключения к базе данных мы используем метод connect(), которому в качестве аргументов передаются вышеперечисленные данные:
Также подключение к базе данных может осуществляться с помощью Connection URI:
Полный пример
Ниже показан основной принцип работы с Psycopg2 на примере работы с таблицей пользователя. В коде создается таблица, заполняется и затем ее данные выводятся в консоль.
Cursor
Перед выполнением запроса, в коде выше создается курсор, который затем закрывается. Какую он играет роль в процессе?
Дело в том, что выполнение запроса в базу данных, гораздо более сложная операция чем может показаться на первый взгляд. Например, если мы делаем запрос на выборку данных, то СУБД не пересылает ее автоматически из базы в наше приложение. Это нужно будет сделать самостоятельно из кода. Почему? Выборка данных может быть огромной, что приведет к резкому скачку использования оперативной памяти. Поэтому база данных хранит данные у себя и передает их по запросу.
С другой стороны, это порождает проблему того, что дополнительная память начинает активно использоваться внутри самой базы данных. Сколько времени хранить данные, которые запросил клиент? Именно поэтому нам приходится закрывать курсор. Когда мы это делаем, то посылается сигнал базе данных, что данные больше не нужны и ресурсы можно освободить.
Может показаться что мы просто переложили проблему с клиента на сервер, но это не совсем так. Базы данных устроены хитро и они стараются максимально оптимизировать работу с данными. Поэтому затрачиваемые ресурсы на хранение выборок ниже. К тому же, передача данных по сети это долго и дорого.
Что будет если не закрыть курсор? Несмотря на то, что курсоры легковесные объекты и множество открытых курсоров не представляет большой проблемы, все же они держат ресурсы системы. Поэтому если забывать их закрывать, то в конце концов это приведет к сбоям в работе приложения.
Исключение составляют лишь циклы, в которых может использоваться один и тот же курсор для множества операций.
Connection
В противовес курсорам, connection, объект соединения с базой каждый раз создавать очень долго. Так что лучшей практикой считается создать одно соединение и использовать его как можно дольше, например в рамках работы с одной сущностью. Также хорошей практикой будет часто коммитить, сохранять действия в базу, или наоборот делать роллбек, откат транзакции.
Рекомендуемые программы
Завершено
0 / 7

