Функция literal_column
Функция literal_column создает объект
ColumnClause из произвольной строки
SQL-выражения. В отличие от bindparam,
значение не передается как параметр, а
встраивается в текст запроса как есть. Первым
параметром функция принимает строку с
SQL-выражением. Вторым необязательным
параметром можно передать тип данных.
Синтаксис
literal_column(text, [type_])
Пример
Давайте создадим простое SQL-выражение и выведем его:
from sqlalchemy import literal_column
expr = literal_column('1 + 1')
print(expr)
Результат выполнения кода:
"1 + 1"
Пример
Давайте используем функцию в запросе к базе данных:
from sqlalchemy import create_engine, select, literal_column
engine = create_engine('sqlite:///:memory:')
stmt = select(literal_column('1 + 1').label('res'))
with engine.connect() as conn:
res = conn.execute(stmt).scalar()
print(res)
Результат выполнения кода:
2
Пример
Давайте применим функцию к таблице
articles и вычислим длину заголовка:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, literal_column
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'title': 'article'},
{'title': 'user'},
])
stmt = select(articles.c.title, literal_column('length(title)').label('len'))
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[('article', 7), ('user', 4)]
Пример
Давайте применим функцию с условием
в секции WHERE:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, literal_column
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'title': 'article'},
{'title': 'user'},
])
stmt = select(articles.c.title).where(literal_column('length(title)') > 5)
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[('article',)]
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE length(title) > 5