Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
6
respostas

O que deu errado?

Fiz minha versão, e tudo parece estar certo, mas o cursor está com erro, mesmo sendo usado igual a como foi na aula.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

O que fiz de errado?

6 respostas

Olá, Hassan, como vai?

Ao analisar o código e a mensagem de erro, há alguns pontos que impedem a execução. O primeiro está na criação do cursor. Você atribuiu cursor = conn.cursor, porém cursor é um método e precisa ser chamado. O correto é utilizar cursor = conn.cursor(). Assim, o objeto retornado terá o método execute() disponível.

Outro detalhe está no INSERT. O método cursor.execute() recebe apenas um conjunto de parâmetros por execução. No seu código, foram passadas duas tuplas consecutivas, o que gera o aviso de sintaxe exibido no terminal. Caso queira inserir vários registros de uma vez, utilize cursor.executemany(), por exemplo: cursor.executemany("INSERT INTO users (id, name, email) VALUES (?, ?, ?)", [(1, "Nathan", "nathan@hotmail.com"), (2, "Kelly", "kelly@hotmail.com")]).

Após esses ajustes, a consulta SELECT * FROM users seguida de fetchall() deverá retornar os dados normalmente.

Você conseguiu identificar a diferença entre armazenar o método conn.cursor e chamar o método com conn.cursor()? Essa distinção aparece com frequência em Python e vale a pena observá la.

Conte com o fórum caso surjam novas dúvidas.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Parece ter funcionado, embora tenha um errinho aparecendo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Muito obrigado pela ajuda até agora!

Oi, Hassan.

Compartilha comigo como está o código agora, por favor?

Pode colar ele aqui no fórum mesmo, assim fica mais fácil para testar.

Sigo a disposição :)

import sqlite3

conn = sqlite3.connect('hotelplus.db')
cursor = conn.cursor()

cursor.execute(
    """
        CREATE TABLE IF NOT EXISTS users(
        id INTEGER PRIMARY KEY,
        name TEXT,
        email TEXT)
    """
)

cursor.executemany(
    """
        INSERT INTO users(
       id, name, email ) VALUES (?, ?, ?)
    """,
    [(1, 'Nathan', 'nathan.hotmail.com')] [(2, 'Kelly', 'kelly.hotmail.com')]
)

cursor.execute(
    """
        SELECT * FROM users
    """
)

conn.commit()

users = cursor.fetchall()
for user in users:
    print(users)

conn.close()
solução!

Oi, Hassan.

Encontrei dois pontos no seu código.

O primeiro está na chamada do executemany. O método recebe a consulta SQL e uma única lista contendo todas as tuplas que serão inseridas. No seu código, foram passadas duas listas separadas, o que faz com que a quantidade de argumentos fique incorreta.

Em vez de:

[(1, 'Nathan', 'nathan.hotmail.com')] [(2, 'Kelly', 'kelly.hotmail.com')]

Utilize:

[
    (1, 'Nathan', 'nathan.hotmail.com'),
    (2, 'Kelly', 'kelly.hotmail.com')
 ]

Outro detalhe está no laço for. Como você já está percorrendo a lista por meio da variável user, o ideal é imprimir essa variável, e não a lista completa users. Caso contrário, a cada iteração será exibida a lista inteira.

Em vez de:

for user in users:
    print(users)

Utilize:

for user in users:
    print(user)

Fazendo esses dois ajustes, o código deve funcionar conforme o esperado. Se surgir alguma outra dúvida durante a atividade, compartilhe no fórum.

Funcionou! muito obrigado!