Что такое SQLAlchemy и каковы его ключевые компоненты

Ответ

SQLAlchemy — это мощный SQL-инструментарий и ORM (Object-Relational Mapper) для Python, который предоставляет полный набор инструментов для работы с базами данных.

Он состоит из двух основных компонентов:

  1. SQLAlchemy Core:

    • Низкоуровневый компонент, который предоставляет SQL Expression Language.
    • Позволяет создавать SQL-запросы программно, используя Python-объекты, что делает код более читаемым и защищенным от SQL-инъекций по сравнению с "сырыми" строками.
    • Не скрывает SQL, а предоставляет для него удобную абстракцию.
  2. SQLAlchemy ORM:

    • Высокоуровневый компонент, построенный поверх Core.
    • Позволяет сопоставлять (маппить) Python-классы с таблицами в базе данных. Это дает возможность работать с записями в БД как с обычными Python-объектами.
    • Управляет сессиями, транзакциями и отношениями между объектами (one-to-one, one-to-many, many-to-many).

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

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

# 1. Определение движка и базового класса для моделей
engine = create_engine('sqlite:///example.db')
Base = declarative_base()

# 2. Описание модели (таблицы)
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    email = Column(String(50))

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

# 4. Работа с данными через сессию
Session = sessionmaker(bind=engine)
session = Session()

# Создание нового пользователя
new_user = User(name='John Doe', email='john.doe@example.com')
session.add(new_user)
session.commit() # Сохранение изменений в БД

# Запрос данных
all_users = session.query(User).all()
for user in all_users:
    print(f'ID: {user.id}, Name: {user.name}')

session.close()

Для управления миграциями схемы базы данных совместно с SQLAlchemy часто используется инструмент Alembic.

Ответ 18+ 🔞

Да ты посмотри на эту штуку, SQLAlchemy, ну просто ёперный театр! Это ж, блядь, целый арсенал для работы с базами данных в Питоне, чтобы не писать эти кривые SQL-строки, от которых потом волосы дыбом встают.

По сути, это две огромные бандуры в одной:

  1. Ядро (Core): Это типа низкоуровневый кирпич, из которого всё лепится. Тут тебе дают язык SQL-выражений. То есть ты не пишешь "SELECT * FROM users WHERE name = 'Вася'", а собираешь запрос из кубиков на Питоне. Защита от инъекций, читаемость — красота, блядь! SQL он не прячет, он его просто причёсывает, сука, делает цивильным.

  2. ORM: А это уже высший пилотаж, надстройка над ядром. Тут уже магия начинается: ты описываешь класс на Питоне, а ORM сам, блядь, догадывается, что это таблица в базе. И ты потом работаешь с записями как с обычными объектами: user.name = 'Колян', session.add(user). Все эти связи "один-ко-многим" и прочую хуйню он тоже берёт на себя.

Вот смотри, как это выглядит в деле, на простом примере:

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

# 1. Заводим движок (это как ключ зажигания) и базовый класс для моделей
engine = create_engine('sqlite:///example.db')
Base = declarative_base()

# 2. Вот наша модель — обычный класс, который станет таблицей 'users'
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)  # Это типа наш главный, уникальный номер, блядь
    name = Column(String(50))
    email = Column(String(50))

# 3. Сила ORM: говорим — создай все таблицы, которые описали. И он создаёт, сука!
Base.metadata.create_all(engine)

# 4. Теперь работаем через сессию — это наше окно в базу
Session = sessionmaker(bind=engine)
session = Session()

# Создаём нового юзера. Просто объект, как будто так и надо!
new_user = User(name='John Doe', email='john.doe@example.com')
session.add(new_user)  # Кинули его в сессию
session.commit()  # БАЦ! И он уже в базе, зафиксировали, ёпта!

# А теперь достаём всех обратно. Никаких строк SQL в глаза не видели!
all_users = session.query(User).all()
for user in all_users:
    print(f'ID: {user.id}, Name: {user.name}')  # Работаем с полями как с атрибутами

session.close()  # Закрыли окно, всё чисто.

А если тебе надо схему базы менять (добавить столбец, таблицу новую), то тут на помощь приходит Alembic. Это отдельная, блядь, песня — инструмент для миграций, который с SQLAlchemy рука об руку идёт. Без него при любом изменении модели пришлось бы таблицы дропать и создавать заново, а это пиздец как неудобно.