Fiz minha versão, e tudo parece estar certo, mas o cursor está com erro, mesmo sendo usado igual a como foi na aula.
O que fiz de errado?
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!
Fiz minha versão, e tudo parece estar certo, mas o cursor está com erro, mesmo sendo usado igual a como foi na aula.
O que fiz de errado?
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.
Parece ter funcionado, embora tenha um errinho aparecendo:
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()
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!