Метод with_hint
Метод with_hint класса Select добавляет
в SQL-запрос подсказки оптимизатору СУБД. Первым
параметром метод принимает таблицу или объект,
к которому относится подсказка. Вторым параметром
передаётся строка с текстом подсказки. Третий
необязательный параметр dialect_name ограничивает
применение подсказки конкретным диалектом СУБД.
Метод возвращает новый объект Select.
Синтаксис
select(table).with_hint(table, text, [dialect_name])
Пример
Давайте создадим модель и добавим простую подсказку
для таблицы articles:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
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))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int] = mapped_column()
Теперь построим запрос с подсказкой:
from sqlalchemy import select
from models import Article
stmt = select(Article).with_hint(Article, 'INDEX(articles idx_title)')
print(stmt)
Результат выполнения кода:
"SELECT articles.id, articles.title, articles.text, articles.status, articles.num
FROM articles INDEX(articles idx_title)"
Пример
Давайте ограничим подсказку конкретным диалектом
через параметр dialect_name:
from sqlalchemy import select
from models import Article
stmt = select(Article).with_hint(
Article,
'INDEX(articles idx_status)',
'sqlite'
)
print(stmt)
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.text, articles.status, articles.num
FROM articles INDEX(articles idx_status)
Пример
Давайте применим подсказку к конкретной таблице в запросе с фильтрацией:
from sqlalchemy import select
from models import Article
stmt = (
select(Article)
.where(Article.status == 'published')
.with_hint(Article, 'INDEX(articles idx_status)')
)
print(stmt)
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.text, articles.status, articles.num
FROM articles INDEX(articles idx_status)
WHERE articles.status = 'published'
Пример
Давайте добавим несколько подсказок к разным таблицам в одном запросе:
from sqlalchemy import select
from models import Article
stmt = (
select(Article)
.with_hint(Article, 'INDEX(articles idx_title)')
.with_hint(Article, 'INDEX(articles idx_status)')
)
print(stmt)
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.text, articles.status, articles.num
FROM articles INDEX(articles idx_title) INDEX(articles idx_status)
Смотрите также
-
класс
Select,
который представляет SQL-запрос SELECT -
метод
prefix_with,
который добавляет префикс к SQL-запросу -
метод
suffix_with,
который добавляет суффикс к SQL-запросу -
метод
execution_options,
который задает опции выполнения запроса