Introduzindo a biblioteca SQLAlchemy e motivações
Olá a todas as pessoas. Nesta aula, vamos entender o que é a biblioteca SQLAlchemy, por que ela existe, instalar e configurar nosso ambiente, criar a conexão com a base de dados e aprender a usar a IA para aumentar nossa produtividade no dia a dia.
Imaginemos que somos uma pessoa analista de dados recém-contratada por uma empresa chamada Data Vendas. Já no primeiro dia, recebemos o primeiro desafio: conectar a base de dados que sustentará todos os relatórios e análises da empresa. Poderíamos construir uma string (cadeia de caracteres) SQL manualmente, mas isso é inseguro, frágil e difícil de migrar entre bases de dados. A SQLAlchemy surgiu justamente para nos ajudar a resolver esse problema: ela traduz nosso código Python para SQL de forma automática e segura.
Por que utilizar essa biblioteca? Porque é fácil migrar entre bases de dados. Por exemplo, se temos SQLite e precisamos migrar para PostgreSQL, com uma única linha de código podemos fazer essa mudança. Além disso, conseguimos montar pipelines (fluxos) de ingestão de dados, construir APIs com FastAPI e evitar SQL Injection (injeção de SQL) ao lidar com dados externos.
Instalando dependências e importando bibliotecas
Agora que já formamos uma breve ideia do que é a biblioteca, vamos realizar as instalações necessárias. Precisamos instalar a biblioteca SQLAlchemy e a biblioteca Pandas, que nos ajudará com suporte a análises — ela é muito conhecida na área de dados e usada com frequência no dia a dia.
Para isso, podemos executar:
A priori, vamos carregar algumas bibliotecas. Primeiro, vamos usar a biblioteca padrão do Python, pathlib, da qual importaremos a classe Path, que ajudará a percorrer nossos diretórios. Faremos a importação da biblioteca SQLAlchemy e também importaremos uma função específica, create_engine, que nos ajudará a criar nossa conexão com a base de dados. Executamos o código e funcionou corretamente.
from pathlib import Path
import sqlalchemy
from sqlalchemy import create_engine
Explicando a engine e configurando a URL de conexão
Agora, vamos criar nossa conexão. A Engine é a porta de entrada da biblioteca SQLAlchemy. Ela representa a conexão com a base e gerencia o pool (conjunto) de conexões em segundo plano, de forma que não precisamos nos preocupar com esses detalhes, pois a biblioteca realiza essa gestão diretamente.
Por padrão, sempre precisamos de uma URL de conexão, que possui a seguinte estrutura: dialeto + driver (controlador), usuário, senha, host, porta e nome da base. Neste curso, vamos usar SQLite, que é uma base em arquivo — ideal para desenvolvimento e também para portfólio. Nesse caso, o dialeto é SQLite, seguido do caminho da pasta e do nome do arquivo que vamos definir como nossa base de dados.
Para deixar claro o formato que vamos usar com SQLite, a URL ficará assim:
"sqlite:///../database/datavendas.db"
Se fosse PostgreSQL, bastaria alterar o dialeto para PostgreSQL, além de configurar o usuário, a senha, localhost, a porta e o nome da base, por exemplo.
Um ponto importante: em projetos reais, a URL de conexão nunca deve ficar disponível diretamente no código (hard-coded). Por quê? Porque pessoas mal-intencionadas podem obter essas credenciais e usá-las para finalidades indevidas. Por isso, é importante sempre carregar essas informações por meio de variáveis de ambiente, evitando expor credenciais. Um exemplo prático seria manter essas variáveis em um arquivo separado e não expô-lo no repositório.
Preparando diretório e criando a engine
Agora, vamos criar nossa conexão de fato. Vamos utilizar a classe Path para especificar o caminho da pasta onde queremos salvar a base. Essa pasta será "database", e queremos criá-la. Vamos usar mkdir com exists_ok=True: se a pasta já existir, tudo bem; caso contrário, vamos criá-la.
Começando pelo caminho:
Ajustamos para apontar para a pasta desejada:
Criamos a pasta:
Path('../database').mkdir()
E garantimos que não dará erro caso ela já exista:
Path('../database').mkdir(exist_ok=True)
Em seguida, vamos criar nossa engine, que é a ponte com a base de dados. Vamos nomeá-la na variável engine e criá-la utilizando create_engine. Primeiro estruturamos a chamada e, em seguida, inserimos a URL de conexão e o parâmetro echo=True para visualizar as instruções SQL geradas.
Começamos declarando a variável:
Em seguida, informamos a URL do SQLite:
engine = create_engine("sqlite:///../database/datavendas.db")
E habilitamos o echo para aprendizado e depuração:
engine = create_engine(
"sqlite:///../database/datavendas.db",
echo=True
)
Por fim, vamos realizar um print para verificar se a engine foi criada. Com a criação confirmada, vamos testar a conexão para garantir que tudo está correto.
print(f'Engine criada: {engine}')
Testando a conexão e apresentando camadas do SQLAlchemy
Vamos importar o módulo text, que faz parte da biblioteca SQLAlchemy. Esse módulo auxilia na escrita de instruções SQL.
from sqlalchemy import text
Em seguida, abriremos a conexão com o nosso banco de dados. Vamos passar uma instrução simples e usar o gerenciador de contexto with para chamar o objeto engine que criamos anteriormente, utilizando a função connect(). Nomearemos essa conexão como com, de “conexão”.
Inicialmente, um exemplo com pequenos erros ilustra as correções que precisamos fazer (aspas e nome do método):
resultado = conn.excute(text("SELECT 'Conexão OK AS status'"))
Agora, com os ajustes aplicados — uso correto de aspas simples na string SQL e do método execute — obtemos o resultado e imprimimos a primeira linha retornada:
with engine.connect() as conn:
resultado = conn.execute(text("SELECT 'Conexão OK' AS status"))
print(resultado.fetchone())
Em seguida, vamos imprimir o resultado na tela para verificar se a conexão foi bem-sucedida. Após os ajustes, a conexão funcionou corretamente. É importante prestar atenção ao nome das funções.
Um ponto importante: usar with é uma boa prática, pois garante o fechamento da conexão mesmo em caso de erro. Com isso, o contexto sempre abrirá e fechará a conexão para nós.
Criamos a conexão, testamos e agora vamos avançar para entender duas camadas importantes do SQLAlchemy: o Core (núcleo), mais próximo do SQL do banco, e a ORM (mapeamento objeto-relacional), com a qual podemos mapear objetos Python. Durante o curso, usaremos ambas as camadas. É fundamental consultar a documentação da biblioteca para evoluirmos e aprendermos continuamente.
Inspecionando o banco e verificando tabelas
Agora, vamos verificar se o banco foi realmente criado, já que estabelecemos a conexão anteriormente. Para isso, usaremos o módulo inspect do SQLAlchemy. Vamos importar a função inspect e criar um inspector, passando a nossa engine.
from sqlalchemy import inspect
Criamos o inspector com a engine:
inspector = inspect(engine)
Em seguida, obteremos uma lista com os nomes das tabelas existentes no banco utilizando o método get_table_names(). Vamos armazenar essa lista em uma variável tabelas e verificar se existem tabelas. Se tabelas contiver resultados, imprimimos tabelas; caso contrário, imprimimos que o banco foi criado e está vazio.
tabelas = inspector.get_table_names()
if tabelas:
print('Tabelas no banco: ')
else:
print('Banco criado e vazio')
Como podemos observar, o banco ainda está vazio. Por quê? Porque ainda não criamos as tabelas. Na próxima aula, veremos como criar essas tabelas. O banco está disponível, apenas vazio.
Utilizando IA para gerar conexão com PostgreSQL
Como mencionamos no início da aula, vamos usar IA para aumentar nossa produtividade. Atualmente, há diversas IAs que auxiliam no dia a dia. Vamos criar um prompt (enunciado) para uma tarefa comum: configurar conexões com bancos usando IA. O prompt (enunciado) é o seguinte: gerar o código SQLAlchemy para criar uma engine conectando ao PostgreSQL, lembrando que usamos SQLite aqui; indicar qual é o host (servidor), qual é a port (porta), qual é o banco de dados, usuário e senha via variável de ambiente; incluir tratamento de erro de conexão e usar o padrão com os.environ.
É importante não colar credenciais, nem mesmo nas IAs que utilizamos. Devemos sempre simular usuário e senha, nunca inserir os reais.
Geramos esse código com Copilot. Ele indicou como instalar as bibliotecas, fazer os imports, carregar as variáveis de ambiente, simular o host (servidor), a port (porta), o nome do banco, a senha e o usuário, além de criar uma URL padrão com o dialeto do PostgreSQL utilizando as variáveis de ambiente. Em seguida, montou a conexão com essa URL, realizou um teste de conexão e incluiu um bloco para, em caso de erro, exibir qual foi o erro.
Se executarmos esse código agora, veremos um erro esperado: o módulo não existe, pois não fizemos as instalações necessárias. Para que o código funcione, será preciso instalar a biblioteca correspondente.