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)
Добавление новых записей в базу данных называется операцией создания.
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()
Чтение относится к извлечению данных из базы данных.
# Получение всех пользователей
users = session.query(User).all()
# Получение первого пользователя
first_user = session.query(User).first()
# Фильтрация по имени
john = session.query(User).filter_by(name="John Doe").first()
Обновление относится к модификации существующих данных.
user = session.query(User).filter_by(name="John Doe").first()
user.name = "Johnathan Doe"
session.commit()
Удаление - это удаление записей из базы данных.
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-запросы.
Тем не менее, важно помнить о жизненном цикле сессии и корректно управлять ею, особенно при выполнении операций обновления и удаления, чтобы избежать потенциальных ошибок и несогласованности данных.
Содержание: