Добро пожаловать в увлекательное путешествие по миру продвинутой веб-разработки.
Сегодня мы начнем с основ ORM – важного инструмента, который связывает наш код с реальной базой данных.
Ну, а SQLAlchemy станет нашим проводником в этом мире. Заваривайте чай (или кофе), и погнали!
Итак, что же значит эта загадочная аббревиатура – ORM?
Ничего сложного. Это – Object-Relational Mapping, или объектно-реляционное отображение, — мостик, связывающий мир объектов Python с реляционными базами данных.
Проще говоря, ORM позволяет работать с базой данных через Python-объекты, а не SQL-запросы.
Зачем нам это нужно?
Представьте ситуацию: у вас есть таблица базы данных с пользователями — users.
Работая напрямую с SQL, вам придется писать что-то вроде этого, чтобы получить всех пользователей старше 30 лет:
SELECT * FROM users WHERE age > 30;
С ORM это становится красивым и читаемым:
users = session.query(User).filter(User.age > 30).all()
И вот — магия! Вместо того, чтобы самому разбираться в тонкостях SQL, вы работаете с привычными объектами Python.
ORM делает за вас всю тяжелую работу по преобразованию запросов в SQL и обратно.
Плюсы ORM
- Меньше кода: ORM автоматически генерирует SQL-запросы.
- Читаемость: мы пишем логику на понятном языке Python.
- Кросс-база: однажды написанный код можно легко перенести с PostgreSQL на SQLite или MySQL (в большинстве случаев).
Минусы ORM
- Производительность: ORM добавляет небольшой "накладной" вес, т.к. формирует SQL-запросы за вас.
- Изучение: вам нужно выучить синтаксис ORM (в нашем случае SQLAlchemy).
- Магия: иногда ORM ведет себя "нелогично", и приходится разбираться в её внутренностях.
Знакомство с SQLAlchemy
SQLAlchemy — это одна из самых популярных ORM для Python.
У нее богатая история, удивительная гибкость и множество поклонников.
Помимо ORM, SQLAlchemy также предлагает низкоуровневый доступ к базе данных (для тех, кто хочет сам писать SQL).
SQLAlchemy делится на две больших части:
- Core: низкоуровневый слой для работы с SQL. Здесь мы вручную пишем SQL-запросы, которые выполняются через SQLAlchemy.
- ORM: высокоуровневый слой, который позволяет работать с базой данных на уровне Python-объектов.
Сегодня мы сосредоточимся на ORM, потому что она делает нашу жизнь проще... ну, чаще всего.
Если вы работали с Django ORM, то возможно заметите сходства и отличия.
Например, SQLAlchemy более гибкая и мощная, но требует чуть больше усилий на настройку.
Она прекрасно подходит для приложений, где нужна кастомизация и детальный контроль.
Примеры использования ORM
Давайте посмотрим, как ORM работает в реальной жизни. Для примера будем оперировать базой данных пользователей.
Представьте базу данных.
У нас есть таблица users:
| id | name | age |
|---|---|---|
| 1 | Ivan | 25 |
| 2 | Maria | 30 |
| 3 | Alex | 35 |
В SQL вы бы написали запрос:
SELECT * FROM users WHERE age > 30;
В ORM же вы работаете с классами. Например, давайте создадим класс User, который соответствует таблице users:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() # База для наших моделей
class User(Base):
__tablename__ = 'users' # Имя таблицы в базе данных
id = Column(Integer, primary_key=True) # Первичный ключ
name = Column(String)
age = Column(Integer)
Теперь выполнение запроса становится проще:
users = session.query(User).filter(User.age > 30).all()
Да, вот так просто!
Преобразование данных: объекты <-> строки
Когда вы пишете:
new_user = User(name='John', age=40)
SQLAlchemy берет ваши данные и преобразует их в SQL-запрос:
INSERT INTO users (name, age) VALUES ('John', 40);
А когда вы делаете запрос, скажем, для получения всех пользователей, ORM преобразует строки из базы данных в удобные объекты Python:
users = session.query(User).all()
for user in users:
print(user.name, user.age)
Реальные случаи использования ORM
В жизни ORM спасает вас от необходимости "плавать" в SQL. Например, представьте, что нужно выполнить несколько сложных операций над данными, таких как вложенные фильтры или сортировки. SQLAlchemy позволяет это сделать на Python-стиле:
users = session.query(User).filter(User.age > 20).order_by(User.name).all()
Здесь ORM автоматически превращает ваш код в SQL-запрос и возвращает результат, который можно сразу использовать.
Итог
Сегодня мы познакомились с ORM как концепцией и SQLAlchemy как её реализацией.
Теперь у нас появилась возможность писать чистый, поддерживаемый код для работы с базами данных, не утопая в бесконечных строках SQL.
На следующей лекции мы установим SQLAlchemy и начнем настраивать её для нашего приложения.
Так что уже сейчас можете приготовить базу данных — будем экспериментировать!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ