- Работа с PostgreSQL в Python
- Модуль psycopg2
- Подключение к базе данных
- Создание таблицы
- Вставка данных
- Извлечение данных
- Обновление таблиц
- Удаление строк
- Заключение
- Работа с PostgreSQL в Python
- Установка
- Начало работы
- Формирование запросов
- Модуль psycopg2.sql
- Транзакции
- 💌 Присоединяйтесь к рассылке
- Проблема с подключением к базу данных PostgreSQL
Работа с PostgreSQL в Python
PostgreSQL — одна из самых продвинутых и широко используемых систем управления реляционными базами данных. Он чрезвычайно популярен по многим причинам, среди которых есть открытый код, его расширяемость и способность обрабатывать различные типы приложений и различные нагрузки.
С помощью Python вы можете легко установить соединение с вашей базой данных PostgreSQL. Существует множество драйверов Python для PostgreSQL, наиболее популярным из которых является «psycopg». Текущая версия — psycopg2.
В этой статье мы обсудим, как получить доступ к базе данных PostgreSQL в Python с помощью драйвера psycopg2.
Модуль psycopg2
Мы можем интегрировать Postgres с Python, используя модуль psycopg2. psycopg2 — это адаптер базы данных Postgres для Python. Чтобы использовать этот модуль, вы должны сначала установить его. Это можно сделать с помощью команды pip , как показано ниже:
Обратите внимание, что я использую Python 3.5, поэтому я использовал pip3 вместо pip .
После установки модуля вы можете использовать его для подключения к вашей базе данных в вашем приложении.
Подключение к базе данных
Чтобы подключиться к вашей базе данных, вы должны сначала создать объект подключения, представляющий базу данных. Затем вы должны создать объект курсора, чтобы помочь вам в выполнении ваших операторов SQL.
В следующем примере показано, как установить соединение с базой данных с именем «postgres»:
В результате получим:
Ниже приведен список параметров, которые были переданы методу connect() :
- database : Имя базы данных, к которой нужно подключиться.
- user : Имя пользователя, которое будет использоваться для аутентификации.
- password : Пароль базы данных для пользователя.
- host : Адрес сервера базы данных. Например, имя домена, «localhost» или IP-адрес.
- port : Номер порта. Если вы не предоставите это, будет использоваться значение по умолчанию, а именно 5432.
Обратите внимание, что значения для вышеуказанных параметров должны быть правильными, чтобы соединение было успешным. Если нет, то будет сгенерировано исключение. Вывод в приведенном выше коде показывает, что соединение с базой данных установлено успешно.
Создание таблицы
Чтобы создать таблицу Postgres в Python, мы используем оператор SQL CREATE TABLE . Этот запрос должен быть выполнен после установления соединения с базой данных. Мы также создаем объект курсора, вызывая метод cursor() , который принадлежит объекту connection . Этот объект cursor используется для фактического выполнения ваших команд.
Затем мы вызываем метод execute() объекта cursor , чтобы помочь нам в создании таблицы. Наконец, нам нужно зафиксировать и закрыть соединение. «Фиксация» соединения говорит драйверу о необходимости посылать команды в базу данных.
Следующий пример демонстрирует это:
В результате получим:
Этот метод commit() помогает нам применить изменения, которые мы внесли в базу данных, и эти изменения не могут быть отменены, если commit() выполнится успешно. Метод close() закрывает соединение с базой данных.
На данный момент мы создали таблицу с 4 столбцами, каждый из которых имеет различные типы данных. Приведенный выше вывод показывает, что таблица была успешно создана.
Вставка данных
Мы можем вставить одну запись или несколько записей в таблицу базы данных Postgres. Опять же, мы должны сначала установить соединение с сервером базы данных, вызвав функцию connect() . Затем мы должны создать объект курсора, вызвав метод cursor() . Наконец, мы должны выполнить инструкцию INSERT через метод execute() , чтобы добавить данные в таблицу.
Вот пример этого в действии:
В результате получим:
После запуска этого кода мы вставили одну запись в нашу таблицу базы данных. Это было сделано путем указания имени таблицы, а также столбцов, в которые нам нужно вставить данные. Мы также можем вставить несколько записей одной командой. Например:
В результате получим:
Поскольку метод commit() не вызывается до тех пор, пока мы не «выполним» все операторы INSERT , несколько записей вставляются с помощью одного вызова метода commit() .
Извлечение данных
Вы можете выбрать данные из базы данных Postgres и просмотреть записи таблицы. Сначала вы должны установить соединение с базой данных, используя функцию connect() . Затем следует создать новый курсор, вызвав метод cursor() . Созданный объект курсора можно затем использовать для выполнения оператора запроса данных из базы данных SELECT .
В результате получим:
Здесь мы извлекли данные из базы данных, указав таблицу и имена столбцов, которые нам нужно извлечь из таблицы базы данных. Эти данные возвращаются нам в виде списка кортежей, причем список «верхнего уровня» представляет собой строки данных. Тогда каждая строка является кортежем данных столбца. Если строки для запроса не возвращаются, тогда возвращается пустой список fetchall() .
Обновление таблиц
Мы можем обновить или изменить детали записи, которая уже была вставлена в таблицу базы данных. Сначала мы должны установить соединение с базой данных, используя метод connect() . Далее мы вызываем функцию cursor() для создания объекта курсора. Наконец, мы запускаем метод execute() для выполнения оператора UPDATE с входными значениями.
В результате получим:
В приведенном выше примере мы обновили значение столбца AGE для всех строк, для которых установлено значение ADMISSION 3420. После выполнения обновления мы извлекаем эти данные, чтобы убедиться, что соответствующие строки / столбцы были обновлены.
Удаление строк
Чтобы удалить запись из таблицы базы данных Postgres, мы должны сначала установить соединение с сервером базы данных. Во-вторых, объект курсора должен быть создан путем вызова функции cursor() . Затем мы запускаем оператор DELETE для выполнения удаления.
В результате получим:
В этом примере мы удалили все записи, в которых регистрационный номер учащегося равен 3420, что в данном случае составляет всего одну строку. После извлечения данных с помощью SELECT мы видим, что эта запись не является частью вышеприведенного вывода, подтверждая, что она была удалена из базы данных.
Заключение
В Python есть разные способы доступа к базе данных PostgreSQL. Существует много драйверов баз данных для Python, которые мы можем использовать для этой цели, но psycopg — самый популярный. В этой статье мы показали, как установить модуль, установить соединение с базой данных PostgreSQL и выполнить распространенные SQL-запросы с использованием кода Python.
Источник
Работа с PostgreSQL в Python
PostgreSQL, пожалуй, это самая продвинутая реляционная база данных в мире Open Source Software. По своим функциональным возможностям она не уступает коммерческой БД Oracle и на голову выше собрата MySQL.
Если вы создаёте на Python веб-приложения, то вам не избежать работы с БД. В Python самой популярной библиотекой для работы с PostgreSQL является psycopg2. Эта библиотека написана на Си на основе libpq.
Установка
Тут всё просто, выполняем команду:
Для тех, кто не хочет ставить пакет прямо в системный python, советую использовать pyenv для отдельного окружения. В Unix системах установка psycopg2 потребует наличия вспомогательных библиотек (libpq, libssl) и компилятора. Чтобы избежать сборки, используйте готовый билд:
Но для production среды разработчики библиотеки рекомендуют собирать библиотеку из исходников.
Начало работы
Для выполнения запроса к базе, необходимо с ней соединиться и получить курсор:
Через курсор происходит дальнейшее общение в базой.
После выполнения запроса, получить результат можно несколькими способами:
- cursor.fetchone() — возвращает 1 строку
- cursor.fetchall() — возвращает список всех строк
- cursor.fetchmany(size=5) — возвращает заданное количество строк
Также курсор является итерируемым объектом, поэтому можно так:
Хорошей практикой при работе с БД является закрытие курсора и соединения. Чтобы не делать это самому, можно воспользоваться контекстным менеджером:
По умолчанию результат приходит в виде кортежа. Кортеж неудобен тем, что доступ происходит по индексу (изменить это можно, если использовать NamedTupleCursor ). Если хотите работать со словарём, то при вызове .cursor передайте аргумент cursor_factory :
Формирование запросов
Зачастую в БД выполняются запросы, сформированные динамически. Psycopg2 прекрасно справляется с этой работой, а также берёт на себя ответственность за безопасную обработку строк во избежание атак типа SQL Injection:
Метод execute вторым аргументом принимает коллекцию (кортеж, список и т.д.) или словарь. При формировании запроса необходимо помнить, что:
- Плейсхолдеры в строке запроса должны быть %s , даже если тип передаваемого значения отличается от строки, всю работу берёт на себя psycopg2.
- Не нужно обрамлять строки в одинарные кавычки.
- Если в запросе присутствует знак %, то его необходимо писать как %%.
Именованные аргументы можно писать так:
Модуль psycopg2.sql
Начиная с версии 2.7, в psycopg2 появился модуль sql. Его цель — упростить и обезопасить работу при формировании динамических запросов. Например, метод execute курсора не позволяет динамически подставить название таблицы.
Это можно обойти, если сформировать запрос без участия psycopg2, но есть высокая вероятность оставить брешь (привет, SQL Injection!). Чтобы обезопасить строку, воспользуйтесь функцией psycopg2.extensions.quote_ident , но и про неё легко забыть.
Транзакции
По умолчанию транзакция создаётся до выполнения первого запроса к БД, и все последующие запросы выполняются в контексте этой транзакции. Завершить транзакцию можно несколькими способами:
- закрыв соединение conn.close()
- удалив соединение del conn
- вызвав conn.commit() или conn.rollback()
Старайтесь избегать длительных транзакций, ни к чему хорошему они не приводят. Для ситуаций, когда атомарные операции не нужны, существует свойство autocommit для connection класса. Когда значение равно True , каждый вызов execute будет моментально отражен на стороне БД (например, запись через INSERT).
💌 Присоединяйтесь к рассылке
Понравился контент? Пожалуйста, подпишись на рассылку.
Источник
Проблема с подключением к базу данных PostgreSQL
Работаю в Pycharm. Решила попробовать бд PostgreSql. Делала всё точно так же, как показано в этом видео https://www.youtube.com/watch?v=kcRCPWW6sow
С помощью Db Browser подключилась к базе данных django. В файле settings.py (все данные проверила):
DATABASES = <
‘default’: <
‘ENGINE’: ‘django.db.backends.postgresql’,
‘NAME’: ‘django’,
“USER”: ‘postgres’,
‘PASSWORD’: ‘***’,
‘HOST’: ‘localhost’,
‘PORT’: ‘5432’,
>
>
После сделала python manage.py migrate. В результате ошибка:
psycopg2.OperationalError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File “manage.py”, line 21, in
main()
File “manage.py”, line 17, in main
execute_from_command_line(sys.argv)
Пробовала в консоли писать
import psycopg2
psycopg2.connect(“dbname=django user=postgres host=localhost password=*** port=5432”)
Выдаёт ошибку:
Traceback (most recent call last):
File “ ”, line 1, in
File “C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\psycopg2\__init__.py”, line 127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
В чём именно проблема не понятно. Помогите, пожалуйста
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Импорт данных из excel файла в базу данных PostgreSQL
Приветствую, форумчане! Есть задание написать программу на delphi,которая импортирует данные из.
Как подключить базу данных PostgreSQL
На локальном сервере PostgreSQL уже имеется база данных с заполненными таблицами. Как теперь её.
Передача обновленных данных из DataGreedView в базу PostgreSQL
Всем привет! Прошу помощи! Ситуация: Подгружается таблица из базы PostgreSQL с использованием.
Как правильно подключить базу данных PostgreSQL
требуется подключить базу данных postgresql пишу QSqlDatabase db =.
рядом с этим текстом нет еще другого, с объяснением?
Добавлено через 1 минуту
Вручную к базе подключаетесь нормально? ACL настраивались?
nataliadolina, Вообще юзер и пароль верно написаны?
Traceback (most recent call last):
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 220, in ensure_connection
self.connect()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 197, in connect
self.connection = self.get_new_connection(conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\postgresql\base.py», line 185, in get_new_connection
connection = Database.connect(**conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\psycopg2\__init__.py», line 127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File «manage.py», line 21, in
main()
File «manage.py», line 17, in main
execute_from_command_line(sys.argv)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\__init__.py», line 401, in execute_from_command_line
utility.execute()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\__init__.py», line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\base.py», line 328, in run_from_argv
self.execute(*args, **cmd_options)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\base.py», line 369, in execute
output = self.handle(*args, **options)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\base.py», line 83, in wrapped
res = handle_func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\commands\migrate.py», line 86, in handle
executor = MigrationExecutor(connection, self.migration_progress_callback)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\executor.py», line 18, in __init__
self.loader = MigrationLoader(self.connection)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\loader.py», line 49, in __init__
self.build_graph()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\loader.py», line 212, in build_graph
self.applied_migrations = recorder.applied_migrations()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\recorder.py», line 76, in applied_migrations
if self.has_table():
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\recorder.py», line 56, in has_table
return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cu rsor())
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 260, in cursor
return self._cursor()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 236, in _cursor
self.ensure_connection()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 220, in ensure_connection
self.connect()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\utils.py», line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 220, in ensure_connection
self.connect()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 197, in connect
self.connection = self.get_new_connection(conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\postgresql\base.py», line 185, in get_new_connection
connection = Database.connect(**conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\psycopg2\__init__.py», line 127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError
(venv) C:\Users\ACER\PycharmProjects\onlineshop\mysite>python manage.py migrate
Traceback (most recent call last):
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 220, in ensure_connection
self.connect()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 197, in connect
self.connection = self.get_new_connection(conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\postgresql\base.py», line 185, in get_new_connection
connection = Database.connect(**conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\psycopg2\__init__.py», line 127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File «manage.py», line 21, in
main()
File «manage.py», line 17, in main
execute_from_command_line(sys.argv)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\__init__.py», line 401, in execute_from_command_line
utility.execute()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\__init__.py», line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\base.py», line 328, in run_from_argv
self.execute(*args, **cmd_options)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\base.py», line 369, in execute
output = self.handle(*args, **options)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\base.py», line 83, in wrapped
res = handle_func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\core\management\commands\migrate.py», line 86, in handle
executor = MigrationExecutor(connection, self.migration_progress_callback)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\executor.py», line 18, in __init__
self.loader = MigrationLoader(self.connection)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\loader.py», line 49, in __init__
self.build_graph()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\loader.py», line 212, in build_graph
self.applied_migrations = recorder.applied_migrations()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\recorder.py», line 76, in applied_migrations
if self.has_table():
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\migrations\recorder.py», line 56, in has_table
return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cu rsor())
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 260, in cursor
return self._cursor()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 236, in _cursor
self.ensure_connection()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 220, in ensure_connection
self.connect()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\utils.py», line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 220, in ensure_connection
self.connect()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 197, in connect
self.connection = self.get_new_connection(conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\postgresql\base.py», line 185, in get_new_connection
connection = Database.connect(**conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\psycopg2\__init__.py», line 127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError
(venv) C:\Users\ACER\PycharmProjects\onlineshop\mysite>python manage.py migrate
Traceback (most recent call last):
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 220, in ensure_connection
self.connect()
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\base\base.py», line 197, in connect
self.connection = self.get_new_connection(conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\utils\asyncio.py», line 26, in inner
return func(*args, **kwargs)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\django\db\backends\postgresql\base.py», line 185, in get_new_connection
connection = Database.connect(**conn_params)
File «C:\Users\ACER\PycharmProjects\onlineshop\venv\lib\site-packages\psycopg2\__init__.py», line 127, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError
The above exception was the direct cause of the following exception:
Источник