Одним из ключевых элементов SQLAlchemy ORM являются сессии, которые представляют собой "рабочую зону" для всех операций с базой данных. Данная статья призвана глубже погрузить вас в понимание того, как работают сессии и как управлять их жизненным циклом.
Сессия — это временная область, в которой происходит вся работа с объектами. Каждая сессия связана с базой данных и представляет собой по сути "разговор" с базой данных. Через сессию проходят все запросы, изменения данных и транзакции.
Создание сессии начинается с определения фабрики сессий:
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
Теперь, чтобы начать разговор с базой данных, вы создаете экземпляр этой сессии:
session = Session()
Сессия проходит несколько этапов в своем жизненном цикле:
add()
.query()
.commit()
.rollback()
.close()
.Объекты внутри сессии могут находиться в разных состояниях:
rollback()
, чтобы вернуть базу данных в предыдущее состояние.Подготовка
Прежде всего, убедимся, что у нас есть база данных и определены модели:
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')
Base.metadata.create_all(engine)
Создание сессии
Session = sessionmaker(bind=engine)
session = Session()
Вставка данных
new_user = User(name="John Doe")
session.add(new_user)
Запросы
users = session.query(User).all()
for user in users:
print(user.name)
Изменение данных
user_to_update = session.query(User).filter_by(name="John Doe").first()
user_to_update.name = "Johnathan Doe"
Фиксация
session.commit()
Откат
Допустим, мы сделали изменение, которое хотим отменить:
user_to_update = session.query(User).filter_by(name="Johnathan Doe").first()
user_to_update.name = "Johnny Doe"
session.rollback()
В этом примере мы изменили имя, но затем решили это отменить. После отката имя пользователя останется "Johnathan Doe".
Закрытие
session.close()
Через этот набор простых примеров мы рассмотрели основные этапы жизненного цикла сессии SQLAlchemy ORM. Главное помнить, что сессия представляет собой мост между вашим кодом и базой данных. Эффективное управление сессией обеспечивает гладкое взаимодействие и предотвращает потенциальные ошибки.
Содержание: