03 A linha 11
credencial nunca mora no código
O programa não conectava: no password supplied. A correção
que todo mundo faz na primeira vez é escrever a senha ali mesmo, junto com
o host e o usuário, porque é onde ela está fazendo falta:
conexao = psycopg2.connect(
host="127.0.0.1",
dbname="neon_db",
user="joao",
password="••••••••" # quem ler o arquivo, lê a senha
)
A senha real estava aqui, por extenso, nesta linha. Ela foi apagada para publicar esta página — e apagar não bastou: ela também foi trocada no banco. O porquê está na aula 05.
Código é feito para ser lido, copiado, colado num chat, mandado por e-mail e publicado. Senha não é feita para nada disso. No minuto em que a senha entra no arquivo, ela herda o destino do arquivo.
E tem o agravante que quase ninguém conta: o Git guarda o histórico.
Apagar a senha num commit novo não tira ela do commit velho. Quem clonar o
repositório leva os dois. A senha continua lá, a um git log de
distância, para sempre.
Agora a parte incômoda: com a senha na linha 11, o programa
funciona. Aparece [ SUCESSO ] na tela. Não tem alerta,
não tem aviso amarelo, nada pede para consertar.
É por funcionar que ninguém volta. Erro que quebra é erro que se arruma no mesmo dia; erro que funciona fica no projeto por anos.
A senha sai do código e vira uma pergunta ao ambiente. Cada valor tem um padrão razoável — menos a senha, cujo padrão é vazio:
params = {
"host": os.environ.get("NEON_DB_HOST", "127.0.0.1"),
"port": os.environ.get("NEON_DB_PORT", "5432"),
"dbname": os.environ.get("NEON_DB_NAME", "neon_db"),
"user": os.environ.get("NEON_DB_USER") or os.environ.get("USER", "postgres"),
"password": os.environ.get("NEON_DB_PASSWORD", ""),
}
E um cuidado a mais, que quase nenhum tutorial ensina: nem o endereço do banco pode ir para o log inteiro, porque a URL de conexão carrega usuário e senha dentro dela.
if database_url:
# Nunca logar a URL completa: ela carrega usuário e senha.
destino = database_url.split("@")[-1] if "@" in database_url else "(local)"
return f"DATABASE_URL ({destino})", database_url
O split("@")[-1] joga fora tudo que vem antes da arroba —
que é exatamente usuario:senha. O log mostra para onde
conectou, nunca com o quê.
As duas capturas de tela da mesma manhã contam a história inteira. Na primeira, às 10:27, a senha está na linha 11 e o programa ainda não roda — por outro motivo, um erro de indentação:
File "/home/joao/Projetos/neon/neon_core.py", line 13
print("[ SUCESSO ] Conexão estabelecida com o cérebro de dados!")
IndentationError: unexpected indent
Doze minutos depois, às 10:39, o espaço a mais foi corrigido e a tela mostra o que a gente estava esperando:
[ SUCESSO ] Conexão estabelecida com o cérebro de dados!
Sucesso — com a senha ainda no código. Essa é a foto mais importante do curso. Ela mostra o exato momento em que o problema deixa de dar sinal.
arquivo · neon_core.py → montar_parametros()
· capturas de 4 de setembro de 2026, 10:27 e 10:39