Метод concat
Метод concat класса ColumnElement создает
SQL-выражение для объединения строк. Метод принимает
произвольное количество аргументов, которые будут
присоединены к исходному выражению. Аргументами могут
быть как строки Python, так и другие объекты
ColumnElement. В сгенерированном SQL-запросе
используется оператор || или функция concat
в зависимости от диалекта СУБД.
Синтаксис
ColumnElement.concat(other, *args)
Пример
Давайте создадим простое выражение, объединяющее две строки:
from sqlalchemy import column, select
expr = column('title').concat(' - article')
res = select(expr)
print(res)
Итоговый SQL запрос:
SELECT title || :title_1 AS anon_1
Пример
Давайте объединим значения двух колонок таблицы
articles:
from sqlalchemy import 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]
from sqlalchemy import select
from models import Article
stmt = select(Article.title.concat(' - ', Article.status))
print(stmt)
Итоговый SQL запрос:
SELECT title || :title_1 || status AS anon_1
FROM articles
Пример
Давайте выполним запрос и посмотрим на результат конкатенации:
from sqlalchemy import 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]
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session
from models import Base, Article
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(
title='article',
text='some text',
status='published',
num=1
))
session.commit()
stmt = select(Article.title.concat(' (', Article.status, ')'))
res = session.execute(stmt).scalar_one()
print(res)
Результат выполнения кода:
"article (published)"
Пример
Давайте используем метод concat в условии
where для фильтрации записей:
from sqlalchemy import 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]
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session
from models import Base, Article
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1', text='text 1', status='new', num=1),
Article(title='article 2', text='text 2', status='published', num=2)
])
session.commit()
stmt = select(Article).where(
Article.title.concat('-', Article.status) == 'article 1-new'
)
res = session.execute(stmt).scalars().all()
print([a.title for a in res])
Результат выполнения кода:
['article 1']
Смотрите также
-
класс
ColumnElement,
который представляет базовый элемент колонки -
метод
contains,
который проверяет вхождение подстроки -
метод
startswith,
который проверяет начало строки -
метод
endswith,
который проверяет окончание строки