Python: количество строк, на которые воздействует cursor.execute ("SELECT ...) - PullRequest
47 голосов
/ 25 марта 2010

Как получить доступ к числу строк, на которые влияет:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")

Ответы [ 4 ]

87 голосов
/ 25 марта 2010

С PEP 249 , который обычно реализуется API-интерфейсами баз данных Python:

Курсорные объекты должны отвечать следующим методам и атрибутам:

[...]

.rowcount
Этот атрибут только для чтения указывает число строк, которые были созданы последним .execute * () (для операторов DQL, таких как «select») или затронуты (для операторов DML, таких как «update» или «insert»).

Но будьте осторожны - он продолжает:

Атрибут равен -1, если для курсора не было выполнено .execute*() или количество строк последней операции не может быть определено интерфейсом. [7]

Примечание:
Будущие версии спецификации DB API могут переопределить последний случай, чтобы объект возвращал None вместо -1.

Итак, если вы выполнили оператор, и , он работает, и , вы уверены, что ваш код всегда будет работать с одной и той же версией той же СУБД разумное решение.

65 голосов
/ 25 марта 2010

Попробуйте использовать fetchone:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
result=cursor.fetchone()

result будет содержать кортеж с одним элементом, значение COUNT(*). Итак, чтобы найти количество строк:

number_of_rows=result[0]

Или, если вы предпочитаете сделать это одним махом:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
(number_of_rows,)=cursor.fetchone()

PS. Хорошей практикой также является использование параметризованных аргументов, когда это возможно, поскольку он может автоматически приводить аргументы для вас при необходимости и защищать от внедрения SQL.

Правильный синтаксис для параметризованных аргументов зависит от вашего адаптера python / database (например, mysqldb, psycopg2 или sqlite3). Это будет выглядеть примерно так:

cursor.execute("SELECT COUNT(*) from result where server_state= %s AND name LIKE %s",[2,digest+"_"+charset+"_%"])
(number_of_rows,)=cursor.fetchone()
36 голосов
/ 14 мая 2010

Количество выполненных строк возвращается из execute:

rows_affected=cursor.execute("SELECT ... ")

Конечно, как уже упоминал AndiDog, вы можете получить количество строк, обратившись к свойству rowcount курсора в любое время, чтобы получить счет для последнего выполнения:

cursor.execute("SELECT ... ")
rows_affected=cursor.rowcount

Из встроенной документации Python MySQLdb:

 def execute(self, query, args=None):

    """Execute a query.

    query -- string, query to execute on server
    args -- optional sequence or mapping, parameters to use with query.

    Note: If args is a sequence, then %s must be used as the
    parameter placeholder in the query. If a mapping is used,
    %(key)s must be used as the placeholder.

    Returns long integer rows affected, if any

    """
16 голосов
/ 08 ноября 2013

На мой взгляд, самый простой способ получить количество выделенных строк - это:

Объект курсора возвращает список с результатами при использовании команд извлечения (fetchall (), fetchone (), fetchmany ()). Чтобы получить выбранные строки, просто напечатайте длину этого списка. Но это просто имеет смысл для fetchall (). ; -)

Пример:

print len(cursor.fetchall) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...