Функция literal
Функция literal создает выражение
BindParameter с флагом literal_execute,
которое представляет литеральное значение
в SQL-запросе. Первым параметром функция
принимает значение, которое нужно вставить
в запрос. Вторым необязательным параметром
можно указать тип этого значения. В отличие
от обычных параметров привязки, литеральное
значение подставляется непосредственно
в текст SQL-запроса на стороне драйвера,
а не передается отдельно.
Синтаксис
literal(value, [type_])
Пример
Давайте создадим простое литеральное выражение и выведем его:
from sqlalchemy import literal
expr = literal('article')
print(expr)
Результат выполнения кода:
"literal('article')"
Пример
Давайте используем функцию literal
в SELECT-запросе для выбора константы:
from sqlalchemy import create_engine, select, literal
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
stmt = select(literal('article'))
res = conn.execute(stmt).scalar()
print(res)
Результат выполнения кода:
"article"
Пример
Давайте передадим литеральное значение с указанием типа данных:
from sqlalchemy import create_engine, select, literal, Integer
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
stmt = select(literal(10, Integer))
res = conn.execute(stmt).scalar()
print(res)
Результат выполнения кода:
10
Пример
Давайте применим literal вместе
с таблицей articles для фильтрации данных
по литеральному значению:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, literal
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'status': 'published'},
{'id': 2, 'title': 'article 2', 'status': 'draft'}
])
stmt = select(articles.c.title).where(
articles.c.status == literal('published')
)
res = conn.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article 1']
Пример
Давайте посмотрим, как выглядит итоговый
SQL-запрос при использовании literal:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, literal
from sqlalchemy.dialects import sqlite
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String)
)
stmt = select(articles.c.title).where(
articles.c.status == literal('published')
)
print(stmt.compile(dialect=sqlite.dialect()))
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE articles.status = 'published'
Смотрите также
-
функцию
literal_column,
которая создает произвольное SQL-выражение -
функцию
bindparam,
которая создает параметр привязки -
функцию
text,
которая создает текстовое SQL-выражение -
функцию
cast,
которая приводит значение к заданному типу