Метод execute класса Session
Метод execute класса Session выполняет
SQL-выражение или ORM-запрос к базе данных.
Первым параметром передается само выражение -
объект text, select, insert,
update или delete.
Вторым необязательным параметром передается
словарь параметров params для подстановки
в запрос. Метод возвращает объект Result,
из которого извлекаются строки результата.
Синтаксис
session.execute(statement, [params])
Пример
Давайте создадим сессию и выполним простой
SQL-запрос через метод execute:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
res = session.execute(text('SELECT 1 AS num'))
print(res.all())
Результат выполнения кода:
[(1,)]
Пример
Давайте выполним запрос с параметрами через
аргумент params:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
res = session.execute(
text('SELECT :title AS title'),
{'title': 'article'}
)
print(res.all())
Результат выполнения кода:
[('article',)]
Пример
Давайте создадим таблицу, добавим строку и
прочитаем данные через метод execute:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
session.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title TEXT, '
'status TEXT)'
))
session.execute(
text('INSERT INTO articles (id, title, status) '
'VALUES (:id, :title, :status)'),
{'id': 1, 'title': 'article', 'status': 'new'}
)
session.commit()
res = session.execute(text('SELECT id, title FROM articles'))
print(res.all())
Результат выполнения кода:
[(1, 'article')]
Пример
Давайте выполним ORM-запрос через метод
execute и получим объекты модели:
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(50))
status: Mapped[str] = mapped_column(String(20))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(id=1, title='article', status='new'))
session.commit()
res = session.execute(select(Article))
for article in res.scalars():
print(article.id, article.title)
Результат выполнения кода:
1 article
Пример
Давайте обновим данные через метод execute
и проверим результат:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
session.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title TEXT, '
'status TEXT)'
))
session.execute(
text('INSERT INTO articles (id, title, status) '
'VALUES (:id, :title, :status)'),
{'id': 1, 'title': 'article', 'status': 'new'}
)
session.execute(
text('UPDATE articles SET status = :status WHERE id = :id'),
{'status': 'done', 'id': 1}
)
session.commit()
res = session.execute(text('SELECT status FROM articles'))
print(res.scalar())
Результат выполнения кода:
"done"