Класс Query
Класс Query представляет собой основной
интерфейс для построения ORM-запросов в
SQLAlchemy. Объект Query создается через
метод query у объекта сессии Session.
Первым параметром передается модель или список
полей, которые нужно выбрать. Класс поддерживает
цепочку методов для фильтрации, сортировки,
ограничения и других операций.
Синтаксис
session.query(Model)
Пример
Давайте создадим сессию и получим объект
Query для модели Article:
from sqlalchemy import create_engine
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article 1', text='text 1', status='active', num=1))
session.add(Article(title='article 2', text='text 2', status='draft', num=2))
session.commit()
q = session.query(Article)
print(q)
Результат выполнения кода:
"SELECT articles.id AS articles_id, articles.title AS articles_title, articles.text AS articles_text, articles.status AS articles_status, articles.num AS articles_num FROM articles"
Пример
Давайте выполним запрос и получим все записи из таблицы:
from sqlalchemy import create_engine
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article 1', text='text 1', status='active', num=1))
session.add(Article(title='article 2', text='text 2', status='draft', num=2))
session.commit()
q = session.query(Article)
res = q.all()
for article in res:
print(article.title)
Результат выполнения кода:
"article 1"
"article 2"
Пример
Давайте применим фильтрацию через цепочку
методов filter и order_by:
from sqlalchemy import create_engine
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article 1', text='text 1', status='active', num=1))
session.add(Article(title='article 2', text='text 2', status='draft', num=2))
session.add(Article(title='article 3', text='text 3', status='active', num=3))
session.commit()
q = session.query(Article).filter(Article.status == 'active').order_by(Article.num)
res = q.all()
for article in res:
print(article.title)
Итоговый SQL запрос:
SELECT articles.id AS articles_id, articles.title AS articles_title, articles.text AS articles_text, articles.status AS articles_status, articles.num AS articles_num
FROM articles
WHERE articles.status = ?
ORDER BY articles.num
Результат выполнения кода:
"article 1"
"article 3"
Пример
Давайте получим только определенные поля
через метод with_entities:
from sqlalchemy import create_engine
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article 1', text='text 1', status='active', num=1))
session.add(Article(title='article 2', text='text 2', status='draft', num=2))
session.commit()
q = session.query(Article).with_entities(Article.title, Article.num)
res = q.all()
for title, num in res:
print(title, num)
Результат выполнения кода:
"article 1 1"
"article 2 2"
Смотрите также
-
метод
filter,
который накладывает условие на запрос -
метод
order_by,
который сортирует результаты запроса -
метод
all,
который возвращает все результаты запроса -
метод
with_entities,
который выбирает только указанные поля