Функция type_coerce
Функция type_coerce приводит выражение
к заданному типу на уровне Python, не создавая
в итоговом SQL-запросе конструкцию CAST.
Первым параметром функция принимает выражение
(колонку, литерал или другой SQL-элемент),
а вторым - целевой тип из модуля sqlalchemy.types.
Это позволяет управлять поведением результата
при обработке драйвером, не вмешиваясь в SQL.
Синтаксис
type_coerce(expression, type_)
Пример
Давайте приведем строковый литерал к типу
JSON и посмотрим на итоговый SQL-запрос:
from sqlalchemy import type_coerce, literal
from sqlalchemy.types import JSON
expr = type_coerce(literal('{"status": "active"}'), JSON)
print(expr)
Результат выполнения кода:
"{\"status\": \"active\"}"
Пример
Давайте применим type_coerce к колонке
и выполним запрос к базе данных:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, type_coerce
from sqlalchemy.types import Numeric
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article', 'num': '10'},
])
stmt = select(type_coerce(articles.c.num, Numeric).label('num'))
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[(Decimal('10'),)]
Пример
Давайте убедимся, что в SQL не появляется CAST:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, type_coerce
from sqlalchemy.types import Numeric
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('num', String),
)
stmt = select(type_coerce(articles.c.num, Numeric))
print(stmt)
Итоговый SQL запрос:
SELECT articles.num AS num FROM articles