Python: Количество строк, затронутых cursor.execute ("ВЫБИРАЮТ …),

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

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
49
задан Tie-fighter 24 March 2010 в 11:52
поделиться

3 ответа

Попробуйте использовать 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 / базы данных (например, 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()
68
ответ дан 7 November 2019 в 11:13
поделиться

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

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

[…]

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

Но будьте осторожны - далее говорится:

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

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

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

87
ответ дан 7 November 2019 в 11:13
поделиться

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

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

    """
37
ответ дан 7 November 2019 в 11:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: