Базы данных
March 22

Программирование баз данных в Python: учебник для начинающих и не только

Python — это мощный и гибкий язык программирования, который предлагает отличные возможности для работы с базами данных. Благодаря разнообразию библиотек и встроенным модулям, Python позволяет легко взаимодействовать с различными системами управления базами данных (СУБД), от популярных реляционных баз данных, таких как MySQL и PostgreSQL, до NoSQL-решений, включая MongoDB и Redis. В этой статье мы рассмотрим, как начать работу с базами данных в Python, используя популярные инструменты и библиотеки.

Введение в DB-API

Python Database API (DB-API) — это стандартный интерфейс для доступа к реляционным базам данных. Он определяет общие методы и объекты для работы с базами данных, что позволяет писать переносимый код. Большинство библиотек взаимодействия с СУБД в Python поддерживают DB-API, что упрощает выполнение таких задач, как подключение к базе данных, выполнение запросов и обработка результатов.

Работа с SQLite

SQLite — легковесная встраиваемая реляционная база данных, которая не требует отдельного серверного процесса. Python поставляется с встроенной поддержкой SQLite через модуль sqlite3.

Пример подключения к SQLite:

import sqlite3

# Подключение к базе данных (или ее создание, если она не существует)
conn = sqlite3.connect('example.db')

# Создание курсора
cur = conn.cursor()

# Создание таблицы
cur.execute('''CREATE TABLE IF NOT EXISTS stocks
               (date text, trans text, symbol text, qty real, price real)''')

# Вставка данных
cur.execute("INSERT INTO stocks VALUES ('2020-01-05','BUY','RHAT',100,35.14)")

# Сохранение (коммит) изменений
conn.commit()

# Закрытие соединения
conn.close()

Работа с MySQL и PostgreSQL

Для работы с MySQL и PostgreSQL можно использовать библиотеки mysql-connector-python и psycopg2 соответственно. Обе библиотеки поддерживают DB-API и предоставляют мощные возможности для взаимодействия с этими СУБД.

Драйвер MySQL

Для работы с MySQL можно использовать mysql-connector-python. Установите его, используя pip:

pip install mysql-connector-python

Пример подключения к MySQL:

import mysql.connector

conn = mysql.connector.connect(
  host="hostname",
  user="username",
  password="password",
  database="dbname"
)

cur = conn.cursor()

cur.execute("SELECT * FROM mytable")

for row in cur.fetchall():
    print(row)

conn.close()

Драйвер PostgreSQL

Psycopg2 — это адаптер PostgreSQL для Python. Для его установки выполните команду:

pip install psycopg2

Или, для установки бинарного пакета, который не требует предварительной компиляции:

pip install psycopg2-binary

Пример подключения к PostgreSQL:

import psycopg2

conn = psycopg2.connect(
  "dbname='dbname' user='username' host='hostname' password='password'"
)
cur = conn.cursor()
cur.execute("SELECT * FROM mytable")

for row in cur.fetchall():
    print(row)

conn.close()

Работа с NoSQL базами данных

Python также предлагает библиотеки для работы с NoSQL базами данных, такими как MongoDB и Redis. Эти базы данных используются для хранения неструктурированных данных и предлагают гибкость в управлении данными.

Драйвер PyMongo

Для работы с MongoDB в Python используйте PyMongo. Установите его следующей командой:

pip install pymongo

Пример подключения к MongoDB:

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
collection = db["mycollection"]
doc = {"name": "John", "address": "Highway 37"}
collection.insert_one(doc)

Драйвер Redis

Для взаимодействия с базой данных Redis из Python вам понадобится библиотека redis-py. Установите её так:

pip install redis

Пример использования Redis:

import redis

r = redis.Redis(host='localhost', port=6379, db=0)
r.set('foo', 'bar')
print(r.get('foo'))

Введение в SQLAlchemy

SQLAlchemy представляет собой мощную библиотеку в Python для работы с базами данных, предлагая два основных режима взаимодействия: Core и ORM. SQLAlchemy Core предоставляет инструменты для выполнения запросов и обработки результатов на низком уровне, в то время как SQLAlchemy ORM (Object-Relational Mapping) позволяет работать с базами данных на более высоком уровне абстракции, используя классы и объекты Python для представления таблиц и записей в базе данных.

Установка SQLAlchemy

SQLAlchemy предоставляет мощные инструменты для работы как с реляционными, так и с нереляционными базами данных через ORM и Core интерфейсы. Для установки SQLAlchemy используйте:

pip install SQLAlchemy

Основы SQLAlchemy Core

SQLAlchemy Core ориентирован на прямую работу с SQL-запросами, предлагая мощный и гибкий способ взаимодействия с базой данных:

from sqlalchemy import create_engine, MetaData, Table, select

# Создание движка
engine = create_engine('sqlite:///example.db')

# Отражение таблицы
metadata = MetaData(bind=engine)
users = Table('users', metadata, autoload=True)

# Выборка
s = select([users])
conn = engine.connect()
result = conn.execute(s)

for row in result:
    print(row)

conn.close()

Работа с SQLAlchemy ORM

SQLAlchemy ORM предоставляет высокоуровневый интерфейс для работы с базами данных, позволяя маппировать классы Python на таблицы баз данных и объекты Python на строки этих таблиц. Это делает код более интуитивно понятным и упрощает разработку:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# Создание движка
engine = create_engine('sqlite:///example.db', echo=True)

# Создание таблицы в БД
Base.metadata.create_all(engine)

# Создание сессии
Session = sessionmaker(bind=engine)
session = Session()

# Добавление нового пользователя
new_user = User(name='John Doe', age=30)
session.add(new_user)
session.commit()

# Запрос
for user in session.query(User).all():
    print(user.name, user.age)

session.close()

Преимущества использования SQLAlchemy

  • Абстракция от конкретного SQL диалекта: SQLAlchemy позволяет писать универсальный код, который может работать с разными СУБД без изменений.
  • Мощные инструменты для запросов: Благодаря выразительному языку запросов SQLAlchemy, можно легко составлять сложные запросы, включая объединения, группировки и подзапросы.
  • Автоматическое управление сессиями: SQLAlchemy ORM управляет сессиями и транзакциями за вас, что уменьшает риск ошибок.
  • Миграции схемы БД: Используя дополнения вроде Alembic, можно легко версионировать и применять миграции схемы базы данных.

SQLAlchemy предлагает мощный и гибкий способ работы с базами данных в Python, подходящий как для простых, так и для сложных проектов, требующих работы с данными.

MongoEngine

MongoEngine — это документо-ориентированный ODM для работы с MongoDB из Python. Он предоставляет высокоуровневый интерфейс для создания, изменения и запроса документов, представленных в виде классов и экземпляров Python. MongoEngine поддерживает большинство функций MongoDB, включая вложенные документы, наследование документов, ссылки на другие документы, а также валидацию и конвертацию данных.

Установка MongoEngine:

pip install mongoengine

Пример использования MongoEngine:

python
from mongoengine import connect, Document, StringField, IntField

# Подключение к MongoDB
connect('mydatabase')

class User(Document):
    name = StringField(required=True, max_length=50)
    age = IntField(required=True)

# Создание и сохранение нового пользователя
user = User(name='John Doe', age=30)
user.save()

# Запрос пользователя
user = User.objects(name='John Doe').first()
print(user.name, user.age)

Pymodm

PyMODM — это другой ODM для MongoDB, разработанный командой MongoDB. Он является частью MongoDB Driver для Python и предлагает похожие на MongoEngine возможности, включая модели, поля, валидацию и управление связями между данными. PyMODM особенно удобен для разработчиков, которые уже используют PyMongo, поскольку он предоставляет более высокий уровень абстракции, оставаясь при этом совместимым с низкоуровневым API PyMongo.

Установка PyMODM:

pip install pymodm

Пример использования PyMODM:

from pymodm import connect, fields, MongoModel

# Подключение к MongoDB
connect('mongodb://localhost:27017/mydatabase')

class User(MongoModel):
    name = fields.CharField()
    age = fields.IntegerField()

# Создание и сохранение пользователя
user = User(name='Jane Doe', age=28).save()

# Запрос пользователя
user = User.objects.raw({'name': 'Jane Doe'}).first()
print(user.name, user.age)

Важность ORM/ODM в разработке

Использование ORM/ODM в проектах Python для работы с MongoDB и другими базами данных существенно упрощает процесс разработки, обеспечивая абстракцию для взаимодействия с данными. Это позволяет разработчикам сосредоточиться на бизнес-логике приложения, минимизируя необходимость написания сложного и повторяющегося кода для управления данными. Важно выбрать подходящий инструмент в зависимости от требований проекта, предпочтений команды и специфики взаимодействия с базой данных.