CRUD-операции в SQLAlchemy

Создание (Create), Чтение (Read), Обновление (Update) и Удаление (Delete) данных в SQLAlchemy ORM

CRUD — это акроним, обозначающий четыре основные функции, используемые при работе с базами данных: Создание (Create), Чтение (Read), Обновление (Update) и Удаление (Delete). SQLAlchemy ORM предоставляет мощные и гибкие инструменты для выполнения этих операций.

Давайте рассмотрим каждую из них в деталях с примерами.

Настройка

Перед тем как начать, давайте определим базовую структуру:

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)

engine = create_engine('sqlite:///mydatabase.db')
Session = sessionmaker(bind=engine)

Создание (Create)

Добавление новых записей в базу данных называется операцией создания.

session = Session()

# Создание нового объекта
new_user = User(name="John Doe")

# Добавление объекта в сессию
session.add(new_user)

# Фиксация изменений
session.commit()

Можно добавить сразу несколько записей:

users = [User(name="Jane Doe"), User(name="Sam Smith")]
session.add_all(users)
session.commit()

Чтение (Read)

Чтение относится к извлечению данных из базы данных.

# Получение всех пользователей
users = session.query(User).all()

# Получение первого пользователя
first_user = session.query(User).first()

# Фильтрация по имени
john = session.query(User).filter_by(name="John Doe").first()

Обновление (Update)

Обновление относится к модификации существующих данных.

user = session.query(User).filter_by(name="John Doe").first()
user.name = "Johnathan Doe"
session.commit()

Удаление (Delete)

Удаление - это удаление записей из базы данных.

user_to_delete = session.query(User).filter_by(name="Sam Smith").first()
session.delete(user_to_delete)
session.commit()

Пакетное обновление и удаление

В отличие от традиционных операций CRUD, SQLAlchemy позволяет выполнять пакетные обновления и удаления без необходимости предварительно извлекать объекты:

# Пакетное обновление
session.query(User).filter(User.name == "John Doe").update({User.name: "Jonathan Doe"})

# Пакетное удаление
session.query(User).filter(User.name == "Sam Smith").delete()

Отношения и связанные операции

SQLAlchemy поддерживает определение отношений между моделями, что позволяет выполнить CRUD-операции на связанных объектах:

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    email = Column(String, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", back_populates="addresses")

User.addresses = relationship("Address", order_by=Address.id, back_populates="user")

# Создание пользователя с адресами
user = User(name="John Doe", addresses=[Address(email="john@example.com")])

Транзакции

SQLAlchemy предоставляет возможность работы с транзакциями. Это позволяет группировать несколько операций и, если одна из них не удастся, откатить все изменения:

try:
    user = User(name="John Doe")
    session.add(user)
    session.commit()
except:
    session.rollback()
    raise
finally:
    session.close()

Заключение

CRUD-операции - это основа взаимодействия с любой базой данных, и SQLAlchemy ORM делает этот процесс интуитивно понятным и эффективным. Основное преимущество использования ORM заключается в том, что он предоставляет абстракцию высокого уровня над SQL, позволяя разработчикам фокусироваться на логике приложения, минимизируя прямые SQL-запросы.

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

Содержание: