Как получить количество строк от SELECT в Python: метод execute
Быстрый ответ
Для определения количества строк после выполнения запроса SELECT воспользуйтесь атрибутом cursor.rowcount, следующим прямо за вызовом cursor.execute(). Код будет выглядеть следующим образом:
cursor.execute("SELECT * FROM table")
print(f"Выбрано строк: {cursor.rowcount}")
Важная деталь: если cursor.rowcount возвращает -1 или None, это указывает на то, что информация о количестве строк недоступна. В поведении этого атрибута есть определённая специфика, связанная напрямую с используемым драйвером базы данных.

Безопасность запроса
Выполняя запросы SELECT, важно помнить об обеспечении их безопасности. Также как вы надеваете шлем, когда выходите на улицу, важно защитить вашу программу от угрозы SQL-инъекций. Для этого используйте параметризованные запросы, как показано ниже:
query = "SELECT * FROM users WHERE username = %s"
cursor.execute(query, ('example_user',))
# Это наш надежный аналог шлема для SQL-запросов
Руководствуйтесь заполнителями вида %s или %(key)s и доверьте процесс экранирования и квотирования адаптеру базы данных.
Эффективное определение количества строк
Если вам необходимо лишь узнать количество строк, не тратя ресурсы на извлечение всех данных, вы можете использовать метод fetchone() вместе с запросом COUNT:
cursor.execute("SELECT COUNT(*) FROM table")
print(f"Подсчёт строк: {cursor.fetchone()[0]}")
# Быстрое определение количества строк без лишних затруднений
Для получения нескольких результатов используйте fetchall() или fetchmany(size), а количество элементов можно определить с помощью функции len().
Адаптация к вашей среде
Важно правильно оформить синтаксис параметризованных запросов, учитывая вашу Python/DB среду. Пример для sqlite3:
query = "SELECT * FROM users WHERE username = ?"
cursor.execute(query, ('example_user',))
# Это как приготовление коктейля: всё зависит от ингредиентов
Визуализация
Представим результат запроса SELECT в виде сцены рыбалки:
🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟
🐠🐟🎣 -> [cursor.execute("SELECT ...")]
Теперь посчитаем наш улов:
rows = cursor.fetchall()
num_rows = len(rows) # Подсчитываем улов 🐠🐟 !
И в итоге получим:
Всего поймано: **num_rows** рыб 🐟 из моря запросов!
Считайте cursor.execute("SELECT...") за заброс сети, fetchall() — за извлечение сети с рыбой, а len() — за подсчёт добычи.
Переходим на путь разрешения распространённых проблем
Доверяй, но проверяй rowcount
При использовании cursor.rowcount нужно знать, что его поведение не гарантировано стандартами DB API. Всегда сверяйтесь с документацией вашего драйвера для получения точной информации.
Управление большими объёмами данных
При работе с большими наборами данных использование метода fetchall() может создать большую нагрузку на систему. Имея в виду сохранность памяти и производительности, используйте fetchone() или fetchmany() для обработки данных порциями:
while True:
row = cursor.fetchone()
if row is None:
break
process_row(row)
# Это оптимальный подход как к расходу памяти, так и к нагрузке на сервер
Знайте свои инструменты
Существуют различные типы курсоров для разных баз данных, в частности, серверные и клиентские. Ваш выбор напрямую повлияет на результаты rowcount.
Будьте в курсе последних обновлений
Следите за последующими обновлениями DB API. Изменения могут оказывать влияние на работу rowcount, аналогично влиянию изменений налогового законодательства на налогообложение.
Готовимся к новым знаниям
Изучаем особенности rowcount
Различные драйверы баз данных могут по-разному интерпретировать rowcount, особенно после выполнения запроса SELECT. Будьте готовы ко всему и не забывайте проверять соответствующую документацию.
Создаем безопасные SQL-запросы
Крайне важно быть осторожными при использовании конкатенации строк: на этом пути легко оставить пролом для SQL-инъекций. Для предотвращения такой ситуации стоит применять параметризованные запросы.
Выбираем правильную стратегию извлечения данных
В зависимости от ваших задач и ресурсов, выбирайте с умом между fetchone(), fetchmany() и fetchall() – подходы заметно отличаются друг от друга, так же как и породы лошадей в скачках.
Полезные материалы
- PEP 249 – Спецификация Python Database API v2.0 – Стандарты Python Database API, включая описание
rowcount. - Руководство пользователя MySQLdb – Инструкция по работе с Python и MySQL, в том числе информация о
rowcount. - Управление данными с помощью Python, SQLite и SQLAlchemy – Руководство по извлечению данных с помощью SQLite и SQLAlchemy в Python.
- Введение в SQLite на Python – Учебник для начинающих, посвящённый работе со SQLite в Python.
- Документация по использованию Query API – SQLAlchemy 1.4 – Сведения об использовании
countв ORM-запросах через SQLAlchemy. - Cursor · mkleehammer/pyodbc Wiki — Описание атрибута
rowcountв объектах курсора pyodbc. - Примеры использования cursor.execute на Python — Примеры использования метода
cursor.execute()в Python.