Professor(a), durante meus estudos sobre gerenciamento de recursos em Python com banco de dados, criei a função obter_conexao() para abrir a conexão:
def obter_conexao():
conectar = psycopg2.connect(
host="localhost",
database="Restaurante",
user="postgres",
password="Minha Senha"
)
return conectar
Com base nisso, testei quatro abordagens para abrir e fechar conexões e cursores:
1️⃣ Manual total (try/finally)
def teste_manual_total():
conexao = None
cursor = None
try:
conexao = obter_conexao()
cursor = conexao.cursor()
cursor.execute("SELECT 1")
print("Resultado:", cursor.fetchone())
except Exception as erro:
print("Erro:", erro)
finally:
if cursor:
cursor.close()
if conexao:
conexao.close()
teste_manual_total()
2️⃣ Automático (with) sem try/except)
def teste_automatico_simples():
with obter_conexao() as conexao:
with conexao.cursor() as cursor:
cursor.execute("SELECT 1")
print("Resultado:", cursor.fetchone())
teste_automatico_simples()
3️⃣ Automático (with) com try/except)
def teste_automatico_with():
try:
with obter_conexao() as conexao:
with conexao.cursor() as cursor:
cursor.execute("SELECT 1")
print("Resultado:", cursor.fetchone())
except Exception as erro:
print("Erro:", erro)
teste_automatico_with()
4️⃣ Híbrido (finally)
def teste_hibrido():
conexao = None
try:
conexao = obter_conexao()
print("✅ Conexão criada")
with conexao.cursor() as cursor:
cursor.execute("SELECT 1")
print("Resultado do cursor:", cursor.fetchone())
except Exception as erro:
print("❌ Erro ocorrido:", erro)
finally:
if conexao:
conexao.close()
print("Conexão fechada no finally")
teste_hibrido()
Pergunta final:
Considerando segurança, prevenção de vazamento de recursos e boas práticas de desenvolvimento, qual dessas abordagens (manual, automática ou híbrida) é considerada a mais segura e recomendada, tanto para projetos reais quanto para aprendizado?
Na minha avaliação, embora a escolha dependa do contexto, a abordagem híbrida — que utiliza with para o cursor (fechamento automático) e fechamento manual da conexão no finally — parece ser a mais segura. Por favor, me corrija se eu estiver equivocado sobre essa questão.
Além disso, poderia explicar as vantagens e desvantagens de cada abordagem, especialmente em relação ao uso de with e finally?