Pergunta

Como posso acessar o número de linhas afetadas por:

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

Solução

Tente usar fetchone:

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

result manterá uma tupla com um elemento, o valor de COUNT(*). Então, para encontrar o número de linhas:

number_of_rows=result[0]

Ou, se você preferir fazê -lo de uma só vez:

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

Ps. Também é uma boa prática usar argumentos parametrizados sempre que possível, porque pode citar automaticamente argumentos para você quando necessário e proteger contra a injeção de SQL.

A sintaxe correta para argumentos parametrizados depende do seu adaptador Python/Database (por exemplo, MySqldB, PsycopG2 ou SQLite3). Seria algo como

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

Outras dicas

A partir de PEP 249, que geralmente é implementado pelas APIs do Python Database:

Os objetos do cursor devem responder aos seguintes métodos e atributos:

[…]

.rowcount
Esse atributo somente leitura especifica o número de linhas que o último .Execute*() produziu (para instruções DQL como 'select') ou afetadas (para instruções DML como 'atualização' ou 'inserção').

Mas tenha cuidado - continua dizendo:

O atributo é -1 no caso de não .execute*() foi realizado no cursor ou a base da última operação não pode ser determinada pela interface. [7]

Observação:
Versões futuras da especificação da API do banco de dados podem redefinir o último caso para que o objeto retorne None em vez de -1.

Então, se você executou sua declaração, e funciona, e Você tem certeza de que seu código sempre será executado contra a mesma versão do mesmo DBMS, esta é uma solução razoável.

O número de linhas efetuadas é devolvido da execução:

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

Obviamente, como o Andidog já mencionado, você pode obter a contagem de linhas acessando a propriedade Rowcount do cursor a qualquer momento para obter a contagem da última execução:

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

A partir da documentação embutida do 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

    """

Na minha opinião, a maneira mais simples de obter a quantidade de linhas selecionadas é a seguinte:

O objeto Cursor retorna uma lista com os resultados ao usar os comandos Fetch (Fetchall (), FetchOne (), FetchMany ()). Para obter as linhas selecionadas, basta imprimir o comprimento desta lista. Mas isso faz sentido para Fetchall (). ;-)

Exemplo:

print len(cursor.fetchall) 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top