Функция func.count
Функция func.count создает SQL-выражение
для подсчета количества строк. Она относится
к семейству агрегатных функций и обычно
применяется вместе с методами select
и group_by. Первым параметром передается
выражение столбца или символ * для
подсчета всех строк.
Синтаксис
func.count(expression)
Пример
Давайте создадим таблицу articles и подсчитаем общее количество статей:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import insert, 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(insert(articles), [
{'title': 'article 1', 'text': 'text 1', 'status': 'published', 'num': 10},
{'title': 'article 2', 'text': 'text 2', 'status': 'draft', 'num': 20},
{'title': 'article 3', 'text': 'text 3', 'status': 'published', 'num': 30},
])
conn.commit()
res = conn.execute(select(func.count()).select_from(articles)).scalar()
print(res)
Результат выполнения кода:
3
Пример
Давайте подсчитаем количество статей по каждому статусу с помощью группировки:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import insert, 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(insert(articles), [
{'title': 'article 1', 'text': 'text 1', 'status': 'published', 'num': 10},
{'title': 'article 2', 'text': 'text 2', 'status': 'draft', 'num': 20},
{'title': 'article 3', 'text': 'text 3', 'status': 'published', 'num': 30},
])
conn.commit()
stmt = select(articles.c.status, func.count()).group_by(articles.c.status)
res = conn.execute(stmt).all()
print(res)
Результат выполнения кода:
[('draft', 1), ('published', 2)]
Пример
Давайте подсчитаем количество строк по конкретному столбцу, передав его в качестве аргумента:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import insert, 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(insert(articles), [
{'title': 'article 1', 'text': 'text 1', 'status': 'published', 'num': 10},
{'title': 'article 2', 'text': 'text 2', 'status': 'draft', 'num': 20},
{'title': 'article 3', 'text': 'text 3', 'status': 'published', 'num': 30},
])
conn.commit()
res = conn.execute(select(func.count(articles.c.title))).scalar()
print(res)
Результат выполнения кода:
3
Пример
Давайте посмотрим, какой SQL-запрос генерирует
функция func.count:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy import 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),
)
stmt = select(func.count()).select_from(articles)
print(stmt)
Итоговый SQL запрос:
SELECT count(*) AS count_1
FROM articles