Класс Session
Класс Session представляет сессию
для работы с базой данных. Сессия управляет
объектами, отслеживает их изменения и
выполняет запросы. Первым параметром
принимает объект bind - движок
или соединение. Сессия является единицей
работы с базой данных.
Синтаксис
Session(bind, [autoflush], [expire_on_commit])
Пример
Давайте создадим сессию для работы с базой
SQLite в памяти:
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
session = Session(bind=engine)
print(session)
Результат выполнения кода:
"<sqlalchemy.orm.session.Session object at 0x...>"
Пример
Давайте создадим модель и добавим запись в базу данных через сессию:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(String(500))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
session = Session(bind=engine)
article = Article(title='article', text='some text')
session.add(article)
session.commit()
print(article.id)
Результат выполнения кода:
1
Пример
Давайте выполним запрос на выборку через сессию:
from sqlalchemy import create_engine, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
session = Session(bind=engine)
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3')
])
session.commit()
stmt = select(Article)
res = session.scalars(stmt).all()
print([article.title for article in res])
Результат выполнения кода:
['article 1', 'article 2', 'article 3']
Пример
Давайте откатим изменения при помощи
метода rollback:
from sqlalchemy import create_engine, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
session = Session(bind=engine)
article = Article(title='article')
session.add(article)
session.flush()
session.rollback()
res = session.scalars(select(Article)).all()
print(len(res))
Результат выполнения кода:
0