Функция func.aggregate_strings
Функция func.aggregate_strings создает SQL-выражение
для агрегации строковых значений. Она принимает два параметра:
столбец или выражение, которое нужно объединить, и строку-разделитель,
которая будет вставлена между значениями. Функция работает как
агрегатная и часто используется совместно с группировкой данных.
Синтаксис
func.aggregate_strings(column, separator)
Пример
Давайте создадим таблицу статей, заполним ее данными и объединим заголовки всех статей в одну строку:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, func
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'title': 'article', 'text': 'text 1', 'status': 'published', 'num': 1},
{'title': 'user', 'text': 'text 2', 'status': 'draft', 'num': 2},
{'title': 'sqlite', 'text': 'text 3', 'status': 'published', 'num': 3}
])
conn.commit()
res = conn.execute(
select(func.aggregate_strings(articles.c.title, ', '))
).scalar()
print(res)
Результат выполнения кода:
"article, user, sqlite"
Пример
Давайте используем функцию func.aggregate_strings
с группировкой по статусу статьи:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, func
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer)
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'title': 'article', 'text': 'text 1', 'status': 'published', 'num': 1},
{'title': 'user', 'text': 'text 2', 'status': 'draft', 'num': 2},
{'title': 'sqlite', 'text': 'text 3', 'status': 'published', 'num': 3}
])
conn.commit()
res = conn.execute(
select(
articles.c.status,
func.aggregate_strings(articles.c.title, '; ')
).group_by(articles.c.status)
).all()
print(res)
Результат выполнения кода:
[('draft', 'user'), ('published', 'article; sqlite')]
Смотрите также
-
функцию
func,
которая создает произвольные SQL-функции -
функцию
func.concat,
которая объединяет строки по колонкам в одной строке -
функцию
func.count,
которая подсчитывает количество строк -
функцию
within_group,
которая задает порядок внутри агрегатной функции