Основы SQLAlchemy ORM

Изучаем SQLAlchemy ORM: классы, сессии и атрибуты

ORM (Object-Relational Mapping) — это техника, позволяющая работать с данными в базе данных, как если бы они были обычными объектами Python.

SQLAlchemy ORM предоставляет мощный интерфейс для работы с базами данных, скрывая за собой сложности SQL. Вместо написания SQL-запросов, вы будете работать с Python-классами и объектами.

Базовые классы

Основа любой модели данных, созданной с использованием ORM, это классы. В SQLAlchemy для создания этих классов используется система декларативных базовых классов.

Что такое декларативный базовый класс?

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

Пример:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

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

class User(Base):
    __tablename__ = 'users'

    ...

Сессии

Сессия в ORM — это способ взаимодействия с базой данных. Это не просто соединение с базой данных или транзакция, но и все операции, которые вы выполняете с объектами, прежде чем они синхронизируются с базой.

Создание сессии

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()

Работа с сессией

  • Добавление объекта:
new_user = User(name='Anna', age=28)
session.add(new_user)
  • Запрос данных:
users = session.query(User).all()
  • Изменение данных:
user = session.query(User).filter_by(name='Anna').first()
user.age = 29
  • Сохранение изменений:

Чтобы сохранить изменения в базе данных, используйте session.commit(). Если что-то пошло не так, вы можете откатить изменения с помощью session.rollback().

Типы данных в SQLAlchemy ORM

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

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

Общие типы данных

  • Integer: представляет целые числа.
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
  • String: представляет строки фиксированной длины.
name = Column(String(50))
  • Text: представляет строки неопределенной длины.
description = Column(Text)
  • DateTime: используется для работы с датами и временем.
created_at = Column(DateTime, default=datetime.utcnow)
  • Float: представляет числа с плавающей точкой.
rating = Column(Float)
  • Boolean: представляет булевы значения (True/False).
is_active = Column(Boolean, default=True)

Специфические для SQL типы данных

  • Enum: представляет перечислимые значения.
from enum import Enum

class UserRole(Enum):
    USER = 'user'
    ADMIN = 'admin'

role = Column(Enum(UserRole))
  • Date: отдельно от DateTime, этот тип используется только для дат.
birth_date = Column(Date)
  • Time: аналогично Date, но только для времени.
log_time = Column(Time)
  • LargeBinary: представляет большие двоичные блобы.
image_data = Column(LargeBinary)

Специализированные типы данных

  • JSON: предоставляет поддержку для хранения и работы с JSON-форматированными данными.
metadata = Column(JSON)
  • ARRAY: применим к некоторым базам данных (например, PostgreSQL) и представляет одномерные массивы.
tags = Column(ARRAY(String))

Важно помнить, что, хотя SQLAlchemy предоставляет эти типы данных, не все из них доступны или имеют смысл для каждой базы данных. Например, тип ARRAY отлично работает с PostgreSQL, но не обязательно будет поддерживаться другими СУБД. Всегда стоит проверять совместимость и рассматривать альтернативные способы реализации, если используемый тип данных не поддерживается вашей СУБД.

Атрибуты в SQLAlchemy ORM

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

Столбцы и их основные атрибуты

  • primary_key: определяет, что столбец является первичным ключом таблицы.
id = Column(Integer, primary_key=True)
  • unique: гарантирует, что значение столбца уникально на протяжении всей таблицы.
username = Column(String(50), unique=True)
  • index: создает индекс для столбца, что может ускорить операции поиска по этому столбцу.
email = Column(String(100), index=True)
  • nullable: определяет, может ли столбец содержать значение NULL.
name = Column(String(50), nullable=False)
  • default: устанавливает значение по умолчанию для столбца.
created_at = Column(DateTime, default=datetime.utcnow)

Отношения и их атрибуты

  • back_populates: устанавливает обратное отношение между двумя моделями.
class User(Base):
    # ...
    posts = relationship("Post", back_populates="author")

class Post(Base):
    # ...
    author = relationship("User", back_populates="posts")
  • lazy: определяет, когда SQLAlchemy будет загружать данные из отношения. Например, "dynamic" делает отношение подобным запросу, который позволяет добавлять дополнительные фильтры.
posts = relationship("Post", lazy="dynamic")
  • uselist: определяет, будет ли отношение возвращать список (True) или одиночный элемент (False).
profile = relationship("Profile", uselist=False)
  • cascade: определяет, какие операции каскадного поведения должны быть применены к отношению.
posts = relationship("Post", cascade="all, delete-orphan")

Дополнительные атрибуты

  • ForeignKey: указывает на связь между столбцами разных таблиц.
author_id = Column(Integer, ForeignKey('users.id'))
  • Composite: позволяет объединять несколько столбцов в одно составное значение.
from sqlalchemy.orm import composite

class Coordinates(Base):
    __tablename__ = 'coordinates'
    x = Column(Integer)
    y = Column(Integer)
    point = composite(Point, x, y)

Заключение

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

Содержание: