Python: Número de linhas afetadas por cursor.execute ("Selecione…)
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+"_%'")
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 retorneNone
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)