2
respostas

prepara_banco KeyError

Boa tarde, pessoal! Podem me ajudar com esse erro, por favor?

for user in cursor.fetchall():
    print(user[1])

Isso me resulta no seguinte erro:

 print(user[1])
KeyError: 1
Numero total de de linhas em usuario: 3
 -------------  Usuários:  -------------

Process finished with exit code 1

Caso eu altere o índice de pouca, funciona, como no exemplo abaixo:

for user in cursor.fetchall():
    print(user['nome'])

Numero total de de linhas em usuario: 3
 -------------  Usuários:  -------------
Danilo
Luan Marques
Nico

Sendo assim, podem me explicar porque isso ocorre, por favor?! Acredito que, por mais difícil que seja fazer alguma alteração no banco, isso causaria muitas alterações no programa, pois teríamos que renomear todos os campos. Sendo assim, sabendo que não é boa prática, gostaria de entender o que está ocorrendo! Obrigado

2 respostas

Consegui realizar a alteração, mas tive que realizar alguns passo para isso: Como eu nao consegui realizar a instalação do MySQLdb, estava utilizando o pymysql (até então).

1 - O pymysql nao permitia o tratamento do SQL como tuplas, passando o keyError quando acontecia.

2- Baixei o MySQL-connector para tentar ajustar o código e nao estava conseguindo. Lendo algumas coisas na net, encontrei que:

3- Tive que desinstalar o MySQL-connector e instalar o MySQL-connector-python, pois nao estava conseguindo realizar a autenticação no servidor com o primeiro. Além disso, aparentemente, o MySQL-connector-python oferece suporte para o tratamento com tuplas.

DE QUALQUER FORMA, se alguém souber me explicar o porquê isso acontece, eu agradeço. Procurei alguma documentação na internet sobre essas extensões, mas nao encontrei nada pertinente. Se puderem pelo menos indicar, eu agradeceria.

Oi Felipe, tudo bem?

O que você estava fazendo era o seguinte:

for user in cursor.fetchall():
    print(user[1])

Porém, ocorreria um erro e só conseguia acessar dessa forma, certo?!

for user in cursor.fetchall():
    print(user['nome'])

Neste caso, acontece que o cursor.fetchall() estava te retornando um dicionário, por isso conseguia acessar somente pela chave, que no caso era nome. No código do professor, o cursor.fetchall() retorna uma tupla, por isso são acessadas pelos índices. Como você utilizou o pymysql, dependendo da forma como o código foi configurado para trabalhar com o pymysql, o retorno estava sendo esse: um dicionário e não uma tupla, por isso que você não conseguia acessar pelos índices e retornava o KeyError.

E o KeyError é retornado quando tentamos acessar uma chave que não está no dicionário. Por exemplo:

Exemplo

Fico feliz que tenha conseguido encontrar uma maneira de resolver isso e trabalhar com tuplas :)

Abraços e bons estudos!