Para essa atividade vamos usar o PostgreSQL e o pg4admin
Um banco de dados é um sistema de armazenamento de dados eletrônico. Um sistema de gerenciamento de banco de dados (SGBD) é um software que permite aos usuários definir, criar, manter e controlar o acesso aos bancos de dados.
A vantagem de trabalhar com um banco de dados é que ele permite que você armazene dados em tabelas e, em seguida, recupere esses dados com consultas. Isso torna mais fácil para você organizar seus dados e torná-los mais acessíveis. Além de fornecer compressão de dados, um banco de dados também oferece segurança, backup e recuperação de dados.
Um sistema de gerenciamento de banco de dados (SGBD) é um software que permite aos usuários definir, criar, manter e controlar o acesso aos bancos de dados. O PostgreSQL é um exemplo de um SGBD.
PostgreSQL é um sistema gerenciador de banco de dados objeto relacional (SGBD), desenvolvido como projeto de código aberto. Hoje é considerado um dos melhores SGBD de código aberto e é utilizado em diversos projetos ao redor do mundo.
Quais são as formas de rodar PostgreSQL usando Docker?
-
Pull da Imagem do PostgreSQL: Se você ainda não tem a imagem do PostgreSQL, pode obtê-la usando o comando
docker pull:docker pull postgres
-
Executando o Contêiner PostgreSQL: Para iniciar um contêiner com PostgreSQL, use o comando
docker run. Você pode especificar a senha do superusuário, o nome do banco de dados e o nome de usuário como variáveis de ambiente:docker run --name meu_postgres -e POSTGRES_PASSWORD=minha_senha -e POSTGRES_USER=meu_usuario -e POSTGRES_DB=meu_banco -p 5432:5432 -v meu_volume_postgres:/var/lib/postgresql/data -d postgres
Substitua
minha_senha,meu_usuarioemeu_bancomeu_volume_postgrespelos valores desejados.-
--name meu_postgres: Define o nome do contêiner comomeu_postgres. -
-e POSTGRES_PASSWORD=minha_senha: Define a senha do superusuário paraminha_senha. -
-e POSTGRES_USER=meu_usuario: Cria um usuário com o nomemeu_usuario. -
-e POSTGRES_DB=meu_banco: Cria um banco de dados com o nomemeu_banco. -
-v meu_volume_postgres:/var/lib/postgresql/data: Monta um volume chamadomeu_volume_postgresna pasta/var/lib/postgresql/datadentro do contêiner. Se o volumemeu_volume_postgresnão existir, ele será criado automaticamente pelo Docker.
-
-p 5432:5432: Mapeia a porta 5432 do contêiner para a porta 5432 na máquina host. -
-d: Executa o contêiner em background. -
Persistência de Dados: Armazena os dados do banco de dados no volume
meu_volume_postgres. Mesmo se o contêiner for removido, os dados permanecerão no volume e estarão disponíveis quando você criar um novo contêiner com o mesmo volume. -
Gerenciamento de Volume: O Docker gerencia este volume, e você pode encontrar os dados armazenados no local de armazenamento de volumes do Docker no seu sistema host.
-
O Dockerfile é um arquivo de texto que contém todas as instruções necessárias para criar uma imagem Docker. Você pode criar uma imagem Docker do PostgreSQL usando um Dockerfile. Aqui, vou mostrar como criar uma imagem Docker do PostgreSQL usando um Dockerfile.
-
Criando um Dockerfile: Crie um arquivo chamado
Dockerfilee adicione o seguinte conteúdo:# Use the official PostgreSQL image as a base FROM postgres:latest # Set environment variables ENV POSTGRES_PASSWORD=minha_senha ENV POSTGRES_USER=meu_usuario ENV POSTGRES_DB=meu_banco # Expose the default PostgreSQL port EXPOSE 5432 # Set the default command to run when starting the container CMD ["postgres"]
Após o Dockerfile estar pronto, você pode criar uma imagem Docker usando o comando docker build:
docker build -t minha_imagem_postgres .-t meu_postgres: Define o nome da imagem comomeu_postgres.
Após a criação da imagem, você pode executar um contêiner com o comando docker run:
docker run --name meu_container_postgres -p 5432:5432 -v meu_volume_postgres:/var/lib/postgresql/data -d minha_imagem_postgres--name meu_postgres: Define o nome do contêiner comomeu_postgres.-p 5432:5432: Mapeia a porta 5432 do contêiner para a porta 5432 na máquina host.-v meu_volume_postgres:/var/lib/postgresql/data: Monta um volume chamadomeu_volume_postgresna pasta/var/lib/postgresql/datadentro do contêiner. Se o volumemeu_volume_postgresnão existir, ele será criado automaticamente pelo Docker.-d: Executa o contêiner em background.
Não podemos salvar as senhas no Dockerfile, pois ele é um arquivo de texto e qualquer um pode ver. Para isso vamos usar as variáveis de ambiente.
O ideal é que você crie um arquivo .env e coloque suas variáveis lá.
touch .envNesse arquivo vamos ter o código
POSTGRES_PASSWORD=minha_senha
POSTGRES_USER=meu_usuario
POSTGRES_DB=meu_bancoAgora vamos usar essas variáveis no nosso Dockerfile
# Use the official PostgreSQL image as a base
FROM postgres:latest
# Define arguments and then convert them to environment variables
ARG POSTGRES_PASSWORD
ARG POSTGRES_USER
ARG POSTGRES_DB
ENV POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
ENV POSTGRES_USER=${POSTGRES_USER}
ENV POSTGRES_DB=${POSTGRES_DB}
# Expose the default PostgreSQL port
EXPOSE 5432
# Set the default command to run when starting the container
CMD ["postgres"]Agora vamos criar nossa imagem
docker build -t minha_imagem_postgres --build-arg POSTGRES_PASSWORD=minha_senha --build-arg POSTGRES_USER=meu_usuario --build-arg POSTGRES_DB=meu_banco .Agora vamos criar nosso contêiner
docker run --name meu_container_postgres -p 5432:5432 -v meu_volume_postgres:/var/lib/postgresql/data -d minha_imagem_postgresVamos usar o pgAdmin para acessar nosso banco de dados
O pgAdmin é um software de código aberto para gerenciamento de banco de dados PostgreSQL. Ele fornece uma interface gráfica para gerenciar e administrar bancos de dados PostgreSQL.
Para instalar o pgAdmin, vamos acessar o Docker Hub e buscar a imagem oficial e seguir os passos
-
Para se conectar a este banco de dados PostgreSQL, você deve usar obter o endereço IP do container docker
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' meu_container_postgres
Após isso você pode acessar o pgAdmin no seu navegador e criar uma conexão com o banco de dados.
CREATE TABLE produtos (
id SERIAL PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
descricao TEXT,
preco NUMERIC(10,2)
);
INSERT INTO produtos (id, nome, descricao, preco) VALUES
(1, 'iPhone 14', 'Apple iPhone 14 128GB Meia-Noite 5G Tela 6,1" Câm. Traseira 12+12MP Frontal 12MP', 4699.00),
(2, 'ThinkPad L14', 'Notebook ThinkPad L14 (14” Intel)', 3328.00),
(3, 'iPad 10.9', 'Apple iPad 10.9" 10ª Geração, Wi-Fi, 256GB, Prateado', 4699.00);
SELECT * FROM produtos;
UPDATE produtos SET preco = 5000 WHERE id = 1;
DELETE FROM produtos WHERE id = 1;
DROP TABLE produtos;
O SQLAlchemy é um ORM (Object Relational Mapper) para Python que facilita a criação de aplicações que utilizam bancos de dados relacionais. Ele fornece uma abstração de alto nível para a criação e manipulação de tabelas sem a necessidade de escrever SQL.
A vantagem de usar um ORM é que você pode escrever código Python para manipular o banco de dados, em vez de escrever SQL. Isso torna o código mais legível e mais fácil de manter.
Precisamos instalar as bibliotecas
pip install sqlalchemy psycopg2-binaryVamos agora criar um arquivo chamado database.py
touch database.pyNesse arquivo vamos ter o código
from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.orm import sessionmaker, declarative_base
import os
from dotenv import load_dotenv
load_dotenv() # Carrega as variáveis de ambiente do arquivo .env
db_user = os.getenv("POSTGRES_USER")
db_password = os.getenv("POSTGRES_PASSWORD")
db_name = os.getenv("POSTGRES_DB")
db_host = os.getenv("DB_HOST")
db_port = os.getenv("DB_PORT")
# Configurando a conexão com o banco de dados
# DATABASE_URL = "postgresql://meu_usuario:minha_senha@localhost:5432/meu_banco"
DATABASE_URL = f"postgresql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}"
# Criando a engine de conexão
engine = create_engine(DATABASE_URL)
# Criando a sessão
Session = sessionmaker(bind=engine)
Base = declarative_base()
# Definindo o modelo de dados
class Produto(Base):
__tablename__ = "produtos"
id = Column(Integer, primary_key=True, index=True)
titulo = Column(String, nullable=False)
descricao = Column(String)
preco = Column(Float, nullable=False)
# Criando a tabela
Base.metadata.create_all(bind=engine)Todos os comandos SQL que você executou anteriormente podem ser executados usando o SQLAlchemy.
Para verificar como foi feita toda a operação de CRUD no SQLAlchemy, olhar a pasta SRC.
Porém, vamos realizar as operações de CRUD usando o FastAPI.
CREATE TABLE bronze_produtos (
id SERIAL PRIMARY KEY,
nome VARCHAR(255),
descricao TEXT,
preco NUMERIC(10,2)
);
INSERT INTO produtos (id, nome, descricao, preco) VALUES
(1, 'iPhone 14', 'Apple iPhone 14 128GB Meia-Noite 5G Tela 6,1" Câm. Traseira 12+12MP Frontal 12MP', 4699.00),
(2, 'ThinkPad L14', 'Notebook ThinkPad L14 (14” Intel)', 3328.00),
(3, 'iPad 10.9', 'Apple iPad 10.9" 10ª Geração, Wi-Fi, 256GB, Prateado', 4699.00);