Gerenciador de Contexto

Explicação

Um context manager no Python é um objeto que define métodos especiais __enter__() e __exit__() que permitem gerenciar recursos de maneira eficiente durante a execução de um bloco de código. Esses recursos podem ser qualquer coisa que precise ser aberto e fechado, como arquivos, conexões de rede, locks ou qualquer outro recurso que requer uma abertura e fechamento explícito.

Os context managers são usados com a instrução with, que garante que o método __exit__() seja chamado quando o bloco de código dentro do with é concluído, mesmo que isso aconteça devido a uma exceção. Isso ajuda a garantir que os recursos sejam liberados corretamente e evita vazamentos de recursos, como arquivos não fechados ou conexões de rede abertas indefinidamente.

Paradigma Funcional

  • Importar a função contextmanager da biblioteca embarcada contextlib:

    from contextlib import contextmanager
    import sqlite3
    
  • Criar a função passando o decorador @contextmanager:

    @contextmanager
    def banco(base_dados = 'tutorial.db'):
    
  • Escrever o resto da função passando a funcionalidade yield no lugar do return garantindo que ela não se encerre, mas sim, devolva o cursor para uso externo e ao concluir os processamentos, retorne à função banco para fechar a conectividade.

        try:
            conn = sqlite3.connect(base_dados)
            cursor = conn.cursor()
        except:
            print('Erro')
        else:
            yield cursor
            conn.commit()
        finally:
            cursor.close()
            conn.close()
    
  • E para chamar a função utilizando a abertura e fechamento da conexão em Banco de Dados, basta utilizar a instrução with:

    with banco() as db:
        db.execute('CREATE TABLE movie(title, year, score)')
    

Paradigma de Orientação à Objetos

  • Importar as bibliotecas desejadas no projeto:

    import sqlite3
    
  • Criar a classe instanciando a funcionalidade de inicialização:

    class Banco:
        def __init__(self, base_dados = 'tutorial.db'):
            self.conn = sqlite3.connect(base_dados)
    
  • Escrever a função __enter__ que fará a abertura do cursor e devolverá o mesmo para uso externo:

        def __enter__(self):
            self.cursor = self.conn.cursor()
            return self.cursor
    
  • Implementar a função __exit__ para que seja chamada assim que todo o uso do cursor acima tenha sido concluído:

        def __exit__(self, *args):
            self.conn.commit()
            self.cursor.close()
            self.conn.close()
    
  • E para chamar a função utilizando a abertura e fechamento da conexão em Banco de Dados, basta utilizar a instrução with:

    with Banco() as db:
        db.execute("""INSERT INTO movie VALUES
                    ('Monty Python and the Holy Grail', 1975, 8.2),
                    ('And Now Something Different', 1971, 7.5)""")