Python: Работа с базой данных, часть 1/2: Используем DB-API
Python DB-API – это не конкретная библиотека, а набор правил, которым подчиняются отдельные модули, реализующие работу с конкретными базами данных. Отдельные нюансы реализации для разных баз могут отличаться, но общие принципы позволяют использовать один и тот же подход при работе с разными базами данных.

В статье рассмотрены основные методы DB-API, позволяющие полноценно работать с базой данных. Полный список можете найти по ссылкам в конец статьи.
Требуемый уровень подготовки: базовое понимание синтаксиса SQL и Python.
Готовим инвентарь для дальнейшей комфортной работы
-
Python имеет встроенную поддержку SQLite базы данных, для этого вам не надо ничего дополнительно устанавливать, достаточно в скрипте указать импорт стандартной библиотеки
import sqlite3
Примечание: внося изменения в базу не забудьте их применить, так как база с непримененными изменениями остается залоченной.
Вы можете использовать (последние два варианта кросс-платформенные и бесплатные):
- Привычную вам утилиту для работы с базой в составе вашей IDE;
- SQLite Database Browser
- SQLiteStudio
Python DB-API модули в зависимости от базы данных
| База данных | DB-API модуль |
|---|---|
| SQLite | sqlite3 |
| PostgreSQL | psycopg2 |
| MySQL | mysql.connector |
| ODBC | pyodbc |
Соединение с базой, получение курсора
Для начала рассмотрим самый базовый шаблон DB-API, который будем использовать во всех дальнейших примерах:
# Импортируем библиотеку, соответствующую типу нашей базы данных import sqlite3 # Создаем соединение с нашей базой данных # В нашем примере у нас это просто файл базы conn = sqlite3.connect('Chinook_Sqlite.sqlite') # Создаем курсор - это специальный объект который делает запросы и получает их результаты cursor = conn.cursor() # ТУТ БУДЕТ НАШ КОД РАБОТЫ С БАЗОЙ ДАННЫХ # КОД ДАЛЬНЕЙШИХ ПРИМЕРОВ ВСТАВЛЯТЬ В ЭТО МЕСТО # Не забываем закрыть соединение с базой данных conn.close()
При работе с другими базами данных, используются дополнительные параметры соединения, например для PostrgeSQL:
conn = psycopg2.connect( host=hostname, user=username, password=password, dbname=database)
Чтение из базы
# Делаем SELECT запрос к базе данных, используя обычный SQL-синтаксис cursor.execute("SELECT Name FROM Artist ORDER BY Name LIMIT 3") # Получаем результат сделанного запроса results = cursor.fetchall() results2 = cursor.fetchall() print(results) # [('A Cor Do Som',), ('Aaron Copland & London Symphony Orchestra',), ('Aaron Goldberg',)] print(results2) # []
Обратите внимание: После получения результата из курсора, второй раз без повторения самого запроса его получить нельзя — вернется пустой результат!
Запись в базу
# Делаем INSERT запрос к базе данных, используя обычный SQL-синтаксис cursor.execute("insert into Artist values (Null, 'A Aagrh!') ") # Если мы не просто читаем, но и вносим изменения в базу данных - необходимо сохранить транзакцию conn.commit() # Проверяем результат cursor.execute("SELECT Name FROM Artist ORDER BY Name LIMIT 3") results = cursor.fetchall() print(results) # [('A Aagrh!',), ('A Cor Do Som',), ('Aaron Copland & London Symphony Orchestra',)]
Примечание: Если к базе установлено несколько соединений и одно из них осуществляет модификацю базы, то база SQLite залочивается до завершения (метод соединения .commit()) или отмены (метод соединения .rollback()) транзакции.
Разбиваем запрос на несколько строк в тройных кавычках
Длинные запросы можно разбивать на несколько строк в произвольном порядке, если они заключены в тройные кавычки — одинарные (»’…»’) или двойные («»». «»»)
cursor.execute(""" SELECT name FROM Artist ORDER BY Name LIMIT 3 """)
Конечно в таком простом примере разбивка не имеет смысла, но на сложных длинных запросах она может кардинально повышать читаемость кода.
Объединяем запросы к базе данных в один вызов метода
Метод курсора .execute() позволяет делать только один запрос за раз, при попытке сделать несколько через точку с запятой будет ошибка.
Для тех кто не верит на слово:
cursor.execute(""" insert into Artist values (Null, 'A Aagrh!'); insert into Artist values (Null, 'A Aagrh-2!'); """) # sqlite3.Warning: You can only execute one statement at a time.
Для решения такой задачи можно либо несколько раз вызывать метод курсора .execute()
cursor.execute("""insert into Artist values (Null, 'A Aagrh!');""") cursor.execute("""insert into Artist values (Null, 'A Aagrh-2!');""")
Либо использовать метод курсора .executescript()
cursor.executescript(""" insert into Artist values (Null, 'A Aagrh!'); insert into Artist values (Null, 'A Aagrh-2!'); """)
Данный метод также удобен, когда у нас запросы сохранены в отдельной переменной или даже в файле и нам его надо применить такой запрос к базе.
Делаем подстановку значения в запрос
Важно! Никогда, ни при каких условиях, не используйте конкатенацию строк (+) или интерполяцию параметра в строке (%) для передачи переменных в SQL запрос. Такое формирование запроса, при возможности попадания в него пользовательских данных – это ворота для SQL-инъекций!
Правильный способ – использование второго аргумента метода .execute()
Возможны два варианта:
# C подставновкой по порядку на места знаков вопросов: cursor.execute("SELECT Name FROM Artist ORDER BY Name LIMIT ?", ('2')) # И с использованием именнованных замен: cursor.execute("SELECT Name from Artist ORDER BY Name LIMIT :limit", )
Примечание 1: В PostgreSQL (UPD: и в MySQL) вместо знака ‘?’ для подстановки используется: %s
Примечание 2: Таким способом не получится заменять имена таблиц, одно из возможных решений в таком случае рассматривается тут: stackoverflow.com/questions/3247183/variable-table-name-in-sqlite/3247553#3247553
UPD: Примечание 3: Благодарю Igelko за упоминание параметра paramstyle — он определяет какой именно стиль используется для подстановки переменных в данном модуле.
Вот ссылка с полезным приемом для работы с разными стилями подстановок.
Делаем множественную вставку строк проходя по коллекции с помощью метода курсора .executemany()
# Обратите внимание, даже передавая одно значение - его нужно передавать кортежем! # Именно по этому тут используется запятая в скобках! new_artists = [ ('A Aagrh!',), ('A Aagrh!-2',), ('A Aagrh!-3',), ] cursor.executemany("insert into Artist values (Null, ?);", new_artists)
Получаем результаты по одному, используя метод курсора .fetchone()
Он всегда возвращает кортеж или None. если запрос пустой.
cursor.execute("SELECT Name FROM Artist ORDER BY Name LIMIT 3") print(cursor.fetchone()) # ('A Cor Do Som',) print(cursor.fetchone()) # ('Aaron Copland & London Symphony Orchestra',) print(cursor.fetchone()) # ('Aaron Goldberg',) print(cursor.fetchone()) # None
Важно! Стандартный курсор забирает все данные с сервера сразу, не зависимо от того, используем мы .fetchall() или .fetchone()
Курсор как итератор
# Использование курсора как итератора for row in cursor.execute('SELECT Name from Artist ORDER BY Name LIMIT 3'): print(row) # ('A Cor Do Som',) # ('Aaron Copland & London Symphony Orchestra',) # ('Aaron Goldberg',)
UPD: Повышаем устойчивость кода
Благодарю paratagas за ценное дополнение:
Для большей устойчивости программы (особенно при операциях записи) можно оборачивать инструкции обращения к БД в блоки «try-except-else» и использовать встроенный в sqlite3 «родной» объект ошибок, например, так:
try: cursor.execute(sql_statement) result = cursor.fetchall() except sqlite3.DatabaseError as err: print("Error: ", err) else: conn.commit()
UPD: Использование with в psycopg2
Благодарю KurtRotzke за ценное дополнение:
Последние версии psycopg2 позволяют делать так:
with psycopg2.connect("dbname='habr'") as conn: with conn.cursor() as cur:
Некоторые объекты в Python имеют __enter__ и __exit__ методы, что позволяет «чисто» взаимодействовать с ними, как в примере выше.
UPD: Ипользование row_factory
Благодарю remzalp за ценное дополнение:
Использование row_factory позволяет брать метаданные из запроса и обращаться в итоге к результату, например по имени столбца.
По сути — callback для обработки данных при возврате строки. Да еще и полезнейший cursor.description, где есть всё необходимое.
Пример из документации:
import sqlite3 def dict_factory(cursor, row): d = <> for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return d con = sqlite3.connect(":memory:") con.row_factory = dict_factory cur = con.cursor() cur.execute("select 1 as a") print(cur.fetchone()["a"])
Дополнительные материалы (на английском)
-
Краткий бесплатный он-лайн курс — Udacity — Intro to Relational Databases — Рассматриваются синтаксис и принципы работы SQL, Python DB-API – и теория и практика в одном флаконе. Очень рекомендую для начинающих!
- www.tutorialspoint.com/sql/index.htm
- www.tutorialspoint.com/sqlite
- www.sqlitetutorial.net
| часть 1/2: Используем DB-API | часть 2/2: Используем ORM |
|---|
Приглашаю к обсуждению:
- Если я где-то допустил неточность или не учёл что-то важное — пишите в комментариях, важные комментарии будут позже добавлены в статью с указанием вашего авторства.
- Если какие-то моменты не понятны и требуется уточнение — пишите ваши вопросы в комментариях — или я или другие читатели дадут ответ, а дельные вопросы с ответами будут позже добавлены в статью.
Как использовать Python для работы с базами данных SQL и NoSQL
Узнайте, как использовать Python для работы с базами данных SQL и NoSQL, с практическими примерами на SQLite и MongoDB!
Алексей Кодов
Автор статьи
10 июля 2023 в 17:48
Python является одним из самых популярных языков программирования, и это благодаря его простоте и гибкости. Одной из областей, где Python очень полезен, является работа с базами данных. В этой статье мы рассмотрим, как использовать Python для работы с базами данных SQL и NoSQL.
Работа с SQL-базами данных
Для работы с SQL-базами данных в Python обычно используются библиотеки, которые предоставляют интерфейс для взаимодействия с базами данных. Самыми распространенными являются sqlite3 , MySQLdb и psycopg2 для SQLite, MySQL и PostgreSQL соответственно.
Пример с SQLite
Давайте рассмотрим пример работы с SQLite, встроенной базой данных, доступной в стандартной библиотеке Python.
import sqlite3 # Создание соединения с базой данных conn = sqlite3.connect('example.db') # Создание курсора для выполнения SQL-запросов cursor = conn.cursor() # Создание таблицы cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)''') # Вставка записи в таблицу cursor.execute("INSERT INTO users (name) VALUES ('John Doe')") # Сохранение изменений conn.commit() # Выборка данных из таблицы cursor.execute("SELECT * FROM users") print(cursor.fetchall()) # Закрытие соединения с базой данных conn.close()
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Работа с NoSQL-базами данных
NoSQL-базы данных предоставляют гибкость и масштабируемость, что делает их популярными для работы с большими объемами данных. Для работы с NoSQL-базами данных в Python также используются специальные библиотеки. Некоторые из популярных NoSQL-баз данных и соответствующих им библиотек: MongoDB ( pymongo ), Redis ( redis-py ), Cassandra ( cassandra-driver ).
Пример с MongoDB
Рассмотрим пример работы с MongoDB, одной из самых популярных NoSQL-баз данных.
# Установка необходимой библиотеки: pip install pymongo from pymongo import MongoClient # Создание соединения с базой данных client = MongoClient('mongodb://localhost:27017/') # Выбор базы данных и коллекции db = client['example_db'] users = db['users'] # Вставка записи в коллекцию user = result = users.insert_one(user) print("Inserted user with id:", result.inserted_id) # Выборка данных из коллекции for user in users.find(): print(user) # Закрытие соединения с базой данных client.close()
В заключение, Python предоставляет удобные инструменты для работы с различными базами данных, будь то SQL или NoSQL. Основной подход заключается в использовании специальных библиотек, которые предоставляют интерфейс для взаимодействия с базами данных. В этой статье мы рассмотрели примеры работы с SQLite и MongoDB, но подходы для других баз данных будут аналогичными.
Как использовать Python для работы с базами данных
Изучите основы работы с базами данных на Python, включая SQLite, PostgreSQL, MySQL и Oracle, с примерами кода и практическими советами.

Алексей Кодов
Автор статьи
23 июня 2023 в 18:51
Python является мощным и гибким языком программирования, который позволяет легко работать с различными базами данных. В данной статье мы рассмотрим основные способы работы с базами данных на Python и покажем некоторые примеры.
Работа с SQLite
SQLite — это встроенная база данных в Python, идеально подходящая для небольших проектов и тестирования. Для работы с SQLite достаточно импортировать модуль sqlite3 .
Создание и подключение к базе данных
import sqlite3 # Создание или подключение к базе данных conn = sqlite3.connect("my_database.db")
Создание таблицы
# Создание объекта курсора для выполнения SQL-запросов cursor = conn.cursor() # Создание таблицы cursor.execute(""" CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER ) """) # Сохранение изменений conn.commit()
Вставка данных
# Вставка одной записи cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 25)) conn.commit() # Вставка нескольких записей data = [("Bob", 30), ("Charlie", 22), ("David", 40)] cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", data) conn.commit()
Запрос данных
# Выборка всех записей cursor.execute("SELECT * FROM users") rows = cursor.fetchall() for row in rows: print(row) # Выборка записей с условием cursor.execute("SELECT * FROM users WHERE age > ?", (25,)) rows = cursor.fetchall() for row in rows: print(row)
Обновление и удаление данных
# Обновление записи cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, "Alice")) conn.commit() # Удаление записи cursor.execute("DELETE FROM users WHERE name = ?", ("Bob",)) conn.commit()
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Работа с другими базами данных
Для работы с другими базами данных, такими как PostgreSQL, MySQL и Oracle, необходимо установить соответствующие пакеты, а затем импортировать и использовать их аналогично модулю sqlite3 .
PostgreSQL
import psycopg2 conn = psycopg2.connect(database="my_database", user="user", password="password", host="localhost", port="5432")
MySQL
import mysql.connector conn = mysql.connector.connect(user="user", password="password", host="localhost", database="my_database")
Oracle
import cx_Oracle conn = cx_Oracle.connect("user/password@localhost:1521/my_database")
Удачной работы с базами данных на Python! Не забывайте закрывать соединение с базой данных после завершения работы:
conn.close()
Заключение
В этой статье мы рассмотрели основные аспекты работы с базами данных на Python, включая создание, подключение, вставку, выборку, обновление и удаление данных. Теперь вы готовы применить эти знания в своих проектах. Удачи вам в изучении Python и разработке!
Что такое базы данных и их роль в программировании на Python


Виртуальное окружение в разработке на языке Python

Моё мнение про Python

Основные аспекты изучения Python

Самые популярные библиотеки Python

Сергей Немчинский: Что пишут на Python? ПЛЮСЫ и МИНУСЫ Python
Базы данных (БД) — это структурированные наборы данных, организованные и хранимые с помощью специальных программ. Базы данных нужны для эффективного хранения, управления и доступа к информации, что делает их важной частью создания программ на Python и многих других языках.

БД позволяют программистам легко добавлять, обновлять, удалять и извлекать информацию из приложения, а также обеспечивают согласованность данных и безопасность. Поговорим об этом подробнее.
Зачем программистам на Python нужны базы данных
Вот несколько ключевых ролей, которые базы данных выполняют в программировании на Python.
- Хранение данных
- Управление данными
- Поиск и извлечение данных
- Согласование данных
- Безопасность данных
- Масштабируемость
Python обладает богатой экосистемой библиотек и модулей для работы с различными типами БД, что делает интеграцию баз данных с приложениями на Python относительно простой задачей.
Обзор баз данных, совместимых с Python
SQLite
SQLite — легкая, встроенная база данных, которая хранит все данные в одном файле без сервера. Она идеально подходит для простых приложений, которым не требуется высокая нагрузочная стойкость. Python поставляется с встроенной поддержкой SQLite, что делает его идеальным выбором для прототипирования и малых проектов.
MySQL
MySQL — это популярная реляционная база данных с открытым исходным кодом. С Python можно использовать MySQL с помощью различных библиотек, таких как `mysql-connector-python`, `PyMySQL` и `MySQLdb`. MySQL хорошо подходит для средних и крупных веб-приложений и может обслуживать большие объемы данных.
PostgreSQL
PostgreSQL — мощная реляционная база данных с акцентом на расширяемость и надежность. Существуют различные библиотеки для работы с PostgreSQL в Python, такие как `psycopg2` и `asyncpg` для асинхронной работы. PostgreSQL часто выбирают для проектов, которым требуется поддержка сложных запросов и расширяемость.
MongoDB
MongoDB — популярная NoSQL база данных, основанная на документах (JSON-подобные объекты). Для работы с MongoDB в Python существуют библиотеки, такие как `pymongo`. MongoDB хорошо подходит для проектов, которым необходима гибкая схема данных и возможность масштабирования горизонтально.
Redis
Redis — высокопроизводительная система хранения данных в памяти. Redis предоставляет удобные структуры данных, такие как строки, списки, хэши, множества и сортированные множества. Для работы с Redis в Python существует библиотека `redis`. Redis широко используется для кэширования и быстрого доступа к данным.
Oracle
Oracle — мощная реляционная база данных, широко применяемая в корпоративных средах. Для работы с Oracle в Python существуют библиотеки, такие как `cx_Oracle`. Oracle обычно выбирают для крупных корпоративных приложений с высокими требованиями к производительности и безопасности.
Создание базы данных в Python
Существует несколько способов создания базы данных в Python с использованием различных модулей. Рассмотрим создание SQLite базы данных, так как SQLite не требует установки отдельного сервера. После создания базы данных можно адаптировать код для работы с другими базами данных, такими как MySQL, PostgreSQL, MongoDB и др.
Готовы начать свой путь в мире программирования? FoxmindEd представляет онлайн-курс Python для начинающих, который поможет вам освоить этот язык и усилить ваш навык!
Начните с минимальных знаний и прокачайтесь до уровня профессионала вместе с нашими менторами-практиками!
Наши студенты проходят этот курс за 4-5 месяцев в среднем.
А еще у нас есть 7 дней тестового периода, бесплатная заморозка курса, и вы можете выбрать подходящий вам уровень менторинга.
Даже если вы абсолютно новичок и начинаете с нуля, не волнуйтесь! У нас есть специальный стартовый курс Python Start, который подойдет для тех, кто только начинает свой путь в программировании.
Шаг 1: Установка модуля SQLite
Python поставляется с модулем `sqlite3`, который обеспечивает встроенную поддержку для работы с SQLite. Нет необходимости устанавливать его отдельно.
Шаг 2: Создание и подключение к базе данных
```python import sqlite3 # Подключение или создание базы данных connection = sqlite3.connect("example.db") ```
При выполнении этого кода будет создан файл `example.db`, если он не существует, или установлено подключение к уже существующей базе данных.
Шаг 3: Создание таблицы
```python # Получение объекта курсора для выполнения операций с базой данных cursor = connection.cursor() # SQL-запрос для создания таблицы create_table_query = """ CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER ); """ # Выполнение SQL-запроса для создания таблицы cursor.execute(create_table_query) # Закрытие курсора (опционально, но рекомендуется) cursor.close() ```
В этом шаге мы создаем таблицу с именем `users`, имеющую столбцы `id`, `name` и `age`. Важно использовать `IF NOT EXISTS`, чтобы не вызывать ошибку, если таблица уже существует.
Шаг 4: Вставка данных
```python cursor = connection.cursor() # SQL-запрос для вставки данных insert_query = """ INSERT INTO users (name, age) VALUES (?, ?); """ # Данные для вставки user_data = [ ("Alice", 25), ("Bob", 30), ("Eve", 22) ] # Выполнение SQL-запроса для вставки данных cursor.executemany(insert_query, user_data) # Сохранение изменений (commit) connection.commit() # Закрытие курсора (опционально, но рекомендуется) cursor.close() ```
Мы используем метод `executemany`, чтобы вставить несколько записей одновременно.
Шаг 5: Извлечение данных
```python cursor = connection.cursor() # SQL-запрос для извлечения данных select_query = """ SELECT * FROM users; """ # Выполнение SQL-запроса для извлечения данных cursor.execute(select_query) # Получение всех данных data = cursor.fetchall() # Вывод данных for row in data: print(row) # Закрытие курсора (опционально, но рекомендуется) cursor.close() ```
В этом шаге мы извлекаем все данные из таблицы `users` и выводим их.
Шаг 6: Закрытие соединения
```python # Закрытие соединения с базой данных connection.close() ```
После завершения работы с базой данных рекомендуется закрыть соединение.
Вы можете применить аналогичные шаги для работы с другими базами данных, заменив соответствующие части кода. Обратите внимание, что рекомендуется использовать контекстные менеджеры (`with`), чтобы автоматически закрывать соединение и курсоры.
Подключение базы данных к Python
Подключение базы данных к Python зависит от типа базы данных, с которой вы хотите работать. Рассмотрим, как подключиться к нескольким популярным базам данных, используя соответствующие библиотеки и модули.

Похожие материалы
Виртуальное окружение в разработке на языке Python
Моё мнение про Python
Основные аспекты изучения Python
Самые популярные библиотеки Python
Сергей Немчинский: Что пишут на Python? ПЛЮСЫ и МИНУСЫ Python
Какие библиотеки Python позволяют работать с базами данных?
sqlite3, SQLAlchemy, PyMySQL, psycopg2 и др.
Могу ли я использовать SQLite в Python без дополнительных библиотек?
Да, модуль sqlite3 входит в стандартную библиотеку.
Что такое ORM?
ORM (Object-Relational Mapping) — это подход, позволяющий работать с базами данных как с объектами.
Как можно мигрировать базы данных в Python?
Используйте инструменты миграции, такие как Alembic или Django Migrations.
Как обеспечить безопасность при работе с базой данных?
Избегайте SQL-инъекций, используя параметризованные запросы или ORM.
Что такое ACID в контексте баз данных?
Это набор свойств транзакций: атомарность, согласованность, изоляция и постоянство.