Метод cast класса ColumnElement
Метод cast класса ColumnElement
создает выражение приведения типа. Он
принимает тип, к которому нужно привести
исходное выражение, и возвращает новый
объект ColumnElement. Метод полезен,
когда нужно изменить тип колонки прямо в
SQL-запросе: например, привести число к
строке или строку к числу.
Первым параметром метод принимает тип,
к которому выполняется приведение. Тип
задается классами из модуля sqlalchemy,
например Integer, String,
Float или Numeric.
Синтаксис
ColumnElement.cast(type_)
Пример
Давайте создадим модель и приведем числовую колонку к строковому типу:
from sqlalchemy import Integer, String, cast
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]
num: Mapped[int]
stmt = Article.__table__.select().with_only_columns(
cast(Article.__table__.c.num, String).label('num_str')
)
print(stmt)
Итоговый SQL запрос:
SELECT CAST(articles.num AS VARCHAR) AS num_str
FROM articles
Пример
Давайте выполним запрос и посмотрим результат приведения:
from sqlalchemy import Integer, String, cast, create_engine, insert
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]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.execute(insert(Article), [
{'title': 'article', 'num': 42},
{'title': 'user', 'num': 7},
])
session.commit()
stmt = (
Article.__table__.select()
.with_only_columns(cast(Article.__table__.c.num, String))
)
res = session.execute(stmt).all()
print(res)
Результат выполнения кода:
[('42',), ('7',)]
Пример
Давайте приведем строковую колонку к целочисленному типу:
from sqlalchemy import Integer, String, cast, create_engine, insert
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]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.execute(insert(Article), [
{'title': 'article', 'num': 100},
])
session.commit()
expr = cast(Article.__table__.c.title, Integer)
print(expr)
Итоговый SQL запрос:
CAST(articles.title AS INTEGER)
Смотрите также
-
класс
ColumnElement,
который представляет базовый элемент колонки -
метод
label,
который задает псевдоним для выражения -
метод
concat,
который объединяет строковые выражения -
метод
op,
который создает произвольный оператор