На данном этапе своего становления в разработке SQLAlchemy мне еще кажется излишним инструментарием. Ведь в моих небольших приложениях мне пока было проще писать все запросы к базам на чистом SQL, упаковывать их в отдельные методы какого-нибудь класса, и всё. Минимум строк кода, всё прекрасно работает. Но от коллег, которые трудились над чем-то грандиозным, я слышал однозначное утверждение, что SQLAlchemy - это база, это понимать надо. Поэтому для себя, а может и не только, я решил написать небольшую шпаргалку с основными понятиями SQLAlchemy, разложенными по полочкам.
SQLAlchemy - библиотека Python для работы с базами данных, поддерживающая как ORM, так и прямую работу с SQL. Я хорошо знаком с ОРМ по прошлой работе, однако в настоящем контексте эта аббревиатура имеет иное значение, поэтому будет пункт 2.
ORM (Object-Relational Mapping) - технология, позволяющая работать с базой данных как с объектами Python.
Далее без лишних слов, чтобы не превратить шпаргалку в статью.
Установка библиотеки
pip install sqlalchemy
Настройка и создание базы данных
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# Создание движка (engine)
engine = create_engine('sqlite:///example.db', echo=True)
# Базовый класс для декларативных классов
Base = declarative_base()
# Создание сессии
Session = sessionmaker(bind=engine)
session = Session()
Определение модели
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# Создание таблиц в базе данных
Base.metadata.create_all(engine)
CRUD операции
Создание (Create)
new_user = User(name='John Doe', age=30)
session.add(new_user)
session.commit()
Чтение (Read)
# Получение всех пользователей
users = session.query(User).all()
for user in users:
print(user.name, user.age)
# Получение одного пользователя
user = session.query(User).filter_by(name='John Doe').first()
print(user.name, user.age)
Обновление (Update)
user = session.query(User).filter_by(name='John Doe').first()
user.age = 31
session.commit()
Удаление (Delete)
user = session.query(User).filter_by(name='John Doe').first()
session.delete(user)
session.commit()
Фильтрация и сортировка
Фильтрация
# Пользователи старше 25 лет
users = session.query(User).filter(User.age > 25).all()
Сортировка
# Сортировка пользователей по возрасту
users = session.query(User).order_by(User.age).all()
Завершение работы сессии
session.close()
Шаблон для создания новых моделей
class ModelName(Base):
__tablename__ = 'modelname'
id = Column(Integer, primary_key=True)
# другие поля
# ...
Основные советы
Используйте
Base.metadata.create_all(engine)
для создания всех таблиц, определенных в моделях.Всегда закрывайте сессию (
session.close()
) после завершения работы с базой данных.Для отладки установите
echo=True
вcreate_engine
, чтобы видеть все SQL-запросы, выполняемые SQLAlchemy.
Эта маленькая шпаргалка охватывает лишь самые основные операции и шаги для работы с SQLAlchemy. Для более продвинутых возможностей придется ознакомиться с документацией или полноценными статьями на эту тему.