ajuda com um select para uma tabela no sqlite do python

35 views
Skip to first unread message

Domingos Diletieri Carvalho

unread,
May 21, 2023, 4:38:45 PM5/21/23
to python...@googlegroups.com
Pessoal boa tarde,

resolvi aprender a usar o sqlite no python conforme sugestão aqui do grupo e estou tentando, para exercício, fazer um programa agenda que possui uma tabela no banco de dados chamada agenda que registra o nome e telefone das pessoas. fiz um comando para criar tabela, inserir itens nessa tabela e funcionou. também fiz para consulta da tabela inteira e funcionou, contudo, a consulta pelo nome não está funcionando, podem me dizer o que estou errando? segue código abaixo (a ideia é ter um input para entrar com o nome a ser consultado):

def Consulta_nome():
nome2 = str(input('Digite um nome da agenda: '))
conexão = sqlite3.connect("agenda.db")
cursor = conexão.cursor()
cursor.execute("select * from agenda where nome values(nome2)", (nome2))
while True:
resultado=cursor.fetchone()
if resultado == None:
break
print("Nome: %s\nTelefone: %s" % (resultado))
cursor.close()
conexão.close()

--
--
Domingos Diletieri Carvalho
domingos...@gmail.com

--

Victório Maculan

unread,
May 22, 2023, 8:49:41 AM5/22/23
to Python Brasil
Olá desenvolvedor,
Muito boa iniciativa de aprender SQLITE, vou comentar seu código abaixo:

def Consulta_nome():
nome2 = str(input('Digite um nome da agenda: '))
conexão = sqlite3.connect("agenda.db")
cursor = conexão.cursor()
cursor.execute("select * from agenda where nome values(nome2)", (nome2))
Você cometeu alguns pequenos erros na linha acima...

Começando pela nome values(nome2) nesse caso, vejo que você confundiu as máscaras, para representar a variável "nome2" você deve usar "?" (Essa é a mascara do SQLITE, equivalente a % do Python), você também poderia colocar diretamente o valor (com uma f-string por exemplo), mas isso deixa seu banco de dados vulnerável a SQLinjections e não é recomendado.

Outra coisa é que, nesse caso, você não pode utilizar values(), e nem é necessário, pois você pode apenas utilizar  nome = ?, lembrando que "?" é a máscara.

O último erro e o mais específico é no jeito que você passa a variável (nome2) para dentro do seu cursor.execute(), bem, sabe aquela velha história que um programador passou dias tentando corrigir um código por conta de uma vírgula? Esse é seu caso, o cursor.execute() recebe uma tupla como argumento, quando você passa (nome2) você está passando apenas a variável "nome2" e não uma tupla, para transformar isso em um tupla apenas adicione uma virgule, assim ficando  (nome2,), de uma olhada no final desse Email para melhor explicação.
while True:
resultado=cursor.fetchone()
if resultado == None:
break
print("Nome: %s\nTelefone: %s" % (resultado))
cursor.close()
conexão.close()
 De resto, seu código está muito bom e corretor. Apenas utilize is invés de == quando operando None (Não sei se realmente faz diferença mas é recomendado).

Como prometido, vou explicar melhor sobre a tupla de uma só elemento, de uma olhada nesse código:
>>> a = ('Olá, mundo')
>>> b = ('Olá, mundo',)
>>> type(a)
<class 'str'>
>>> type(b)
<class 'tuple'>
Observe como, com a virgula, a variável se torna uma tupla.

Qualquer outra dúvida não hesite em perguntar!
--
Atenciosamente,
Victório H. S. Maculan

Conheça-me mais:
* Meu perfil no Github

Domingos Diletieri Carvalho

unread,
May 22, 2023, 3:09:41 PM5/22/23
to python...@googlegroups.com
Gratidao.

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/cfb38154-b080-4234-b384-650ed2be559en%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages