Utilizando Dotenv para Gerenciamento de Variáveis de Ambiente e Alembic
Tags: python, tutorial, beginners, productivity
Published: 2023-12-21 17:56:06

## Introdução
Em meus projetos, especialmente ao trabalhar em ambientes de desenvolvimento local, utilizo variáveis de ambiente como uma estratégia eficaz para separar configurações sensíveis, como chaves de API e credenciais de banco de dados. Neste artigo, aprofundaremos no conceito de Dotenv, destacando seus benefícios e explorando como posso integrá-lo ao Alembic, por exemplo, para facilitar o gerenciamento de migrações de banco de dados. Aqui também falarei sobre vantagens e algumas desvantagens ao usá-lo.

## O que é Dotenv?
[Dotenv ](https://pypi.org/project/python-dotenv/)é uma biblioteca popular em várias linguagens de programação, incluindo Python, que permite carregar variáveis de ambiente de um arquivo `.env` para o ambiente em que minha aplicação está sendo executada. Em vez de definir variáveis de ambiente diretamente no sistema operacional ou em um serviço de hospedagem, posso armazená-las em um arquivo `.env` na raiz do meu projeto.

# Vantagens ao usar `.env`

### Isolamento e Segurança

Ao usar um arquivo `.env`, você mantém suas variáveis de ambiente em um local isolado, separado do código-fonte. Isso ajuda a garantir que informações sensíveis, como chaves de API e credenciais, não sejam expostas inadvertidamente.

### Portabilidade

Com o [Dotenv](https://pypi.org/project/python-dotenv/), é fácil mover seu projeto entre diferentes ambientes (dev, homol, prod) sem modificar as variáveis de ambiente. Basta ter um arquivo `.env` correspondente para cada ambiente.

### Facilidade de Configuração

Gerenciar variáveis de ambiente através de um arquivo `.env`simplifica a configuração e inicialização de seu projeto, especialmente quando você não está trabalhando sozinho.

# Hands On!

Caso queira ver o projeto, eu subi o [repo no github](https://github.com/rotirotirafa/dotenv_use) :).

# Configure o ambiente
Com seu `venv` criado instale o `python-dotenv`, no exemplo vamos utilizar o `alembic`, então:

`pip install alembic python-dotenv`

Crie o seu arquivo `.env` e insira a variavel de ambiente da seguinte forma:

`DATABASE_URL=postgresql://db_username:db_pw@localhost/db_name`

Observe que o DATABASE_URL está em CAPS e o valor após o `=` está fora de aspas duplas (ou simples).

OBS: no [repositorio](https://github.com/rotirotirafa/dotenv_use) tem um exemplo subindo o postgres com o docker.

# Configurando o Alembic
Para iniciar o alembic rode o comando: `alembic init alembic` (modulo -- comando -- pasta destino)

Na raiz do projeto será criado uma pasta chamada `alembic` e dentro dela tem um arquivo `Env.py` que vamos edita-lo para usar o `python-dotenv`


![Env.py](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l8we7yem40qq59i848w3.png)

A função `load_dotenv()` faz com que ela enxergue o arquivo `.env` na raiz do seu projeto, carregando todas as variáveis que você criar para dentro do seu projeto.

Para utilizar, basta chamar a sua variável da seguinte forma: `os.getenv("NOME_VAR")`

Voltando para configuração do Alembic, para que ele consiga enxergar a variável de conexão com o banco de dados basta ajudar o código da função `run_migrations_online`


![run_migrations_online](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/obb1q9f1vrsv0xdedjv9.png)

OBS: Veja que na imagem há o `config`, ele puxa a configuração do arquivo `alembic.ini` da raiz, caso não utilize `.env`, por padrão é necessário alterar lá. Essa é uma das vantagens de se usar o `python-dotenv`.

Agora basta rodar a migration:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nbude2g0bsjs6ul3yaz2.png)

Utilizando o Dotenv, tenho uma maneira conveniente e segura de gerenciar variáveis de ambiente em meus projetos Python. Ao combinar essa prática com ferramentas como Alembic, posso manter um gerenciamento eficiente de configurações sensíveis e simplificar a migração de banco de dados em multiplos ambientes. 

## Mas nem tudo são flores...

Há desvantagens em usar Dotenv.

### Complexidade em Ambientes Distribuídos 

Em ambientes distribuídos ou em sistemas orquestrados como Kubernetes, gerenciar variáveis de ambiente com um arquivo `.env` pode não ser a abordagem mais eficiente. Nestes casos, ferramentas específicas de gerenciamento de configuração ou serviços de segredos podem ser mais apropriados (Hashicorp Vault, AWS Secrets Manager).

### Risco de Exposição

Se o arquivo `.env` contiver informações sensíveis e não for tratado corretamente (por exemplo, não sendo incluído no .gitignore), existe o risco de expor informações sensíveis, especialmente se o código-fonte for compartilhado ou versionado publicamente.

### Dependência Externa

Embora o Dotenv seja uma ferramenta útil, introduzir uma dependência externa em seu projeto pode aumentar a complexidade, especialmente se você estiver trabalhando em um ambiente onde a gestão de dependências é crítica.

### Desacoplamento com Outras Ferramentas

Em alguns cenários, integrar o Dotenv com certas ferramentas ou serviços pode exigir configurações adicionais ou scripts personalizados, o que pode complicar o processo de desenvolvimento ou implantação.

### Desempenho

Em sistemas de alta carga ou aplicações onde cada milissegundo conta, ler variáveis de ambiente de um arquivo pode introduzir uma sobrecarga mínima em comparação com outras formas mais eficientes de gerenciamento de configurações.

Embora o Dotenv ofereça uma maneira conveniente e segura de gerenciar variáveis de ambiente em projetos Python, é essencial avaliar cuidadosamente as necessidades e requisitos específicos do seu projeto. Em alguns cenários, outras abordagens ou ferramentas podem ser mais adequadas para garantir a segurança, eficiência e escalabilidade da sua aplicação.