Saltar al contenido

Python: número de filas afectadas por cursor.execute (“SELECT …)

Solución:

De PEP 249, que generalmente es implementado por las API de la base de datos de Python:

Los objetos de cursor deben responder a los siguientes métodos y atributos:

[…]

.rowcount

Este atributo de solo lectura especifica el número de filas que produjo el último .execute * () (para declaraciones DQL como ‘seleccionar’) o afectadas (para declaraciones DML como ‘actualizar’ o ‘insertar’).

Pero tenga cuidado, continúa diciendo:

El atributo es -1 en caso de que no .execute*() se ha realizado en el cursor o el recuento de filas de la última operación no puede ser determinado por la interfaz. [7]

Nota:

Las versiones futuras de la especificación de la API de base de datos podrían redefinir el último caso para que el objeto vuelva None en lugar de -1.

Entonces, si ha ejecutado su declaración, y funciona, y está seguro de que su código siempre se ejecutará con la misma versión del mismo DBMS, esta es una solución razonable.

Intenta usar fetchone:

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

result contendrá una tupla con un elemento, el valor de COUNT(*). Entonces, para encontrar el número de filas:

number_of_rows=result[0]

O, si prefiere hacerlo de una sola vez:

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

PD. También es una buena práctica utilizar argumentos parametrizados siempre que sea posible, ya que puede citar argumentos automáticamente cuando sea necesario y protege contra la inyección de SQL.

La sintaxis correcta para argumentos parametrizados depende de su adaptador de base de datos / python (por ejemplo, mysqldb, psycopg2 o sqlite3). Se vería algo así como

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

El número de filas afectadas se devuelve desde la ejecución:

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

por supuesto, como AndiDog ya mencionó, puede obtener el recuento de filas accediendo a la propiedad de recuento de filas del cursor en cualquier momento para obtener el recuento de la última ejecución:

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

De la documentación en línea de 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

    """
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *