0% acharam este documento útil (0 voto)
36 visualizações91 páginas

Python Com Banco de Dados

Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
36 visualizações91 páginas

Python Com Banco de Dados

Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 91

17/10/2024, 23:36 Python com banco de dados

Python com banco de dados


Prof. Frederico Tosta de Oliveira

Apresentação

Vamos estudar o desenvolvimento de aplicações para armazenamento e


recuperação de informação em banco de dados utilizando a linguagem
de programação Python, compreendendo os passos e as ações
necessárias para realizar a manipulação de registro em banco de dados,
de forma a garantir o correto funcionamento de programas que tenham
essas características.

Propósito

Preparação

Para estudar este conteúdo, tenha a versão 3.7 do Python ou posterior


instalada em seu computador. É possível pesquisar e baixar a versão
mínima recomendada (3.7) no site oficial do Python. Utilizamos a IDE
PyCharm Community para programar os exemplos aqui apresentados, e
você pode baixá-la gratuitamente no site oficial da JetBrains. Para
visualizar os dados e tabelas, utilizaremos o DB Browser for SQLite,
também disponível gratuitamente. Para acompanhar melhor os
exemplos, clique aqui para baixar o arquivo Banco de dados.zip, que
contém os scripts utilizados neste material.

Objetivos
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 1/91
17/10/2024, 23:36 Python com banco de dados

Módulo 1

Frameworks e bibliotecas para


gerenciamento de dados

Reconhecer as funcionalidades de frameworks e bibliotecas para


gerenciamento de banco de dados.

Módulo 2

Conexão, acesso e criação de banco de dados


Empregar as funcionalidades para conexão, acesso e criação de
bancos de dados e tabelas.

Módulo 3

Inserção, remoção e atualização de tabelas


do banco de dados
Aplicar as funcionalidades para inserção, remoção e atualização de
registros em tabelas.

Módulo 4

Recuperação de registros em tabelas do


banco de dados

Empregar as funcionalidades para recuperação de registros em


tabelas.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 2/91


17/10/2024, 23:36 Python com banco de dados

meeting_room
Introdução
Olá! Vamos abordar alguns dos principais tópicos relacionados à
integração de programas escritos em Python e os SGBD mais
adotados. Veremos como realizar as conexões, criar tabelas,
relacionamentos e inserir novos registros no banco.

Além disto, aprenderemos a recuperar dados do banco utilizando


consultas simples e até as mais complexas, implementando o
comando JOIN para selecionar dados relacionados. Assista ao
vídeo e confira!

Material para download


Clique no botão abaixo para fazer o download do
conteúdo completo em formato PDF.

Download material

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 3/91


17/10/2024, 23:36 Python com banco de dados

1 - Frameworks e bibliotecas para gerenciamento de dados


Ao final deste módulo, você será capaz de reconhecer as funcionalidades de frameworks e
bibliotecas para gerenciamento de banco de dados.

Conectores para banco de dados


Vamos conhecer os principais conectores de bancos de dados em
Python, essenciais para desenvolvedores que buscam integrar suas
aplicações com diferentes sistemas de gerenciamento de bancos de
dados (SGBDs).

Conectores, como psycopg2 para PostgreSQL,


MySQLclient, PyMySQL, MySQL Connector/Python
para MySQL, e sqlite3 para SQLite, seguem a
especificação Python Enhancement Proposals (PEP)
249, garantindo uma interface padronizada e
consistente.

A escolha do conector adequado pode impactar a performance, a


facilidade de instalação e a compatibilidade com recursos avançados do
banco de dados, permitindo uma comunicação eficiente e segura entre o
aplicativo e o SGBD.

Confira neste vídeo os principais conectores de bancos de dados em


Python e saiba como escolher o mais adequado para integrar suas
aplicações com PostgreSQL, MySQL e SQLite.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 4/91


17/10/2024, 23:36 Python com banco de dados

Quando estamos trabalhando com banco de dados, precisamos


pesquisar por bibliotecas que possibilitem a conexão da aplicação com
o banco de dados que iremos utilizar.

Na área de banco de dados, essas bibliotecas se chamam conectores ou


adaptadores.

Conectores.

Como estamos trabalhando com Python, devemos procurar por


conectores que atendam a PEP 249.

Essa PEP especifica um conjunto de padrões que os conectores devem


seguir, a fim de garantir um melhor entendimento dos módulos e maior
portabilidade entre bancos de dados.

Veja a seguir exemplos de padrões definidos pela DB-API 2.0.

PEP 249
Python Database API Specification v2.0 - DB-API 2.0.

PEP
Python Enhancement Proposal.

Nomes de métodos
Close, commit e cursor.

Nomes de classes
Connection e Cursor.

Tipos de exceção

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 5/91


17/10/2024, 23:36 Python com banco de dados

IntegrityError e InternalError.

Acompanhe agora exemplos de conectores que implementam a DB-API


2.0.

settings_system_daydream psycopg2

Conector mais utilizado para o banco de dados


PostgreSQL.

cloud_sync mysqlclient, PyMySQL e mysql-connector-


python

Conectores para o banco de dados MySQL.

cloud_done sqlite3

Adaptador padrão do Python para o banco de dados


SQLite.

Explorando conectores para banco de dados em Python

Conectores para bancos de dados são bibliotecas escritas para facilitar


as operações entre programa e aplicações de banco. Essas bibliotecas
possuem interfaces mais enxutas e uma forma comum de criar
conexões, executar operações CRUD e outras tarefas relacionadas à
comunicação com bancos de dados.

Devido à variedade de fornecedores de bancos de dados, existem


também diversos conectores para o Python. Inclusive, em alguns casos,
podemos escolher entre diferentes conectores para o mesmo tipo de
banco, veja!

Psycopg2 expand_more

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 6/91


17/10/2024, 23:36 Python com banco de dados

É uma biblioteca de código aberto em Python que serve para


bancos de dados PostgreSQL, sendo a escolha ideal para
conectar programas Python a este tipo de banco. É
implementado em C e Python, oferecendo uma combinação de
desempenho e facilidade de uso. O psycopg2 ainda suporta
muitas funcionalidades avançadas do PostgreSQL, como tipos
de dados específicos, transações complexas e recursos de
notificação. Oferece um bom desempenho em razão de sua
implementação parcialmente em C.

MySQLclient expand_more

É uma biblioteca baseada em C, resultando em um desempenho


mais rápido em comparação com bibliotecas puramente em
Python. É um sucessor do MySQL-python e oferece
compatibilidade com a API DB-API 2.0, padrão em bibliotecas de
banco de dados Python. Sua instalação pode ser mais complexa,
especialmente no Windows, pois requer a presença de um
compilador C e bibliotecas de desenvolvimento do MySQL.

PyMySQL expand_more

É escrito inteiramente em Python, facilitando a instalação, pois


não há necessidade de um compilador C ou bibliotecas de
desenvolvimento adicionais. Pode ser instalado facilmente em
qualquer ambiente que suporte Python, tornando-o uma boa
escolha para desenvolvimento e ambientes onde a instalação de
compiladores é difícil. Geralmente mais lento que outros
conectores devido à ausência de código nativo em C.

MySQL Connector expand_more

É desenvolvido e mantido pela Oracle, a mesma empresa


responsável pelo MySQL, o que garante maior compatibilidade e
suporte. Assim como o PyMySQL, é escrito totalmente em
Python, facilitando a instalação, pois não exige compiladores ou
bibliotecas adicionais. Pode ser instalado via pip, sem pré-
requisitos extras. Embora seja mais lento que o MySQLclient

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 7/91


17/10/2024, 23:36 Python com banco de dados

devido à ausência de código nativo em C, seu desempenho é


geralmente comparável ao do PyMySQL. Além disso, este
conector suporta recursos avançados do MySQL, como
conectividade SSL/TLS, autenticação pluggable e suporte
completo para Unicode.

SQLite expand_more

É um banco de dados embutido que não requer um servidor


separado. Todo o banco de dados é armazenado em um único
arquivo, sem necessidade de instalação ou configuração
complexa, o que o torna ideal para aplicações pequenas e
médias, desenvolvimento e testes. É muito rápido para ler e
escrever em arquivos de tamanho pequeno a médio, mas pode
não ser tão eficiente para grandes volumes de dados ou cargas
de trabalho intensas. Por ser fácil de usar, é comum em
aplicativos móveis, navegadores e outras aplicações que
valorizam simplicidade e leveza.

Atividade 1

Para desenvolver aplicações Python que interajam com diferentes


sistemas de gerenciamento de bancos de dados (SGBDs), precisamos
selecionar o conector apropriado. Considere as seguintes opções de
conectores para PostgreSQL e MySQL. Qual conector é mais adequado
para se conectar a um banco de dados PostgreSQL em uma aplicação
Python?

A MySQLclient

B PyMySQL

C psycopg2

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 8/91


17/10/2024, 23:36 Python com banco de dados
D MySQL Connector/Python

E sqlite3

Parabéns! A alternativa C está correta.

O psycopg2 é especificamente projetado para conectar aplicações


Python a bancos de dados PostgreSQL, oferecendo suporte avançado e
desempenho otimizado para esse SGBD. As outras alternativas são
conectores para MySQL ou SQLite.

Principais métodos e exceções dos


conectores em Python
Para o desenvolvimento eficiente de aplicações que interagem com
bancos de dados, é necessário compreendermos os principais métodos e
exceções dos conectores em Python.

A partir da sua utilização adequada, seus desenvolvedores podem


gerenciar conexões e manipular dados de forma robusta, seguindo
padrões da DB-API 2.0 e garantindo a integridade dos dados e a eficácia
das operações em ambientes empresariais.

Neste vídeo, veremos como utilizar connect, commit e execute, bem


como manejar exceções como IntegrityError e OperationalError. Assista!

Ao utilizarmos um conector de banco de dados no nosso programa,


adicionamos diversas possibilidades e também desafios ao
desenvolvimento. Enquanto podemos utilizar classes e métodos para
executar tarefas e criar representações, temos que lidar com as possíveis
exceções retornadas pelo conector.

Apenas o conector para SQLite está disponível nativamente no Python


3.7. Todos os demais precisam ser instalados.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 9/91


17/10/2024, 23:36 Python com banco de dados

Utilizaremos o banco de dados SQLite para demonstrar o


desenvolvimento de aplicações Python para banco de dados. Apesar do
nome Lite, o SQLite é um banco de dados completo, que permite a
criação de tabelas, relacionamentos, índices, gatilhos e visões.

Representação de banco de dados.

O SQLite também tem suporte a subconsultas, transações, junções,


pesquisa em texto (full text search), restrições de chave estrangeira, entre
outras funcionalidades. Porém, por não ter um servidor para seu
gerenciamento, o SQLite não provê um acesso direto pela rede. As
soluções existentes para acesso remoto são caras e ineficientes.

Além disso, o SQLite não tem suporte à autenticação, com usuários e


permissões definidas. Estamos falando aqui sobre usuários do banco de
dados, que têm permissão para criar tabela, inserir registros etc.

Atenção!

Apesar do SQLite não ter suporte à autenticação, podemos e devemos


implementar nosso próprio controle de acesso para nossa aplicação.

Principais métodos dos conectores em Python

Antes de começarmos a trabalhar diretamente com banco de dados,


precisamos conhecer algumas classes e métodos disponibilizados pelos
conetores e previstos na PEP 249.

Esses métodos são a base para qualquer aplicação que necessite de


acesso a banco de dados. Veja a seguir!

Connect expand_more

Função global do conector para criar uma conexão com o


banco de dados.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 10/91


17/10/2024, 23:36 Python com banco de dados

Retorna um objeto do tipo Connection.

Connection expand_more

Classe utilizada para gerenciar todas as operações no banco de


dados.

Principais métodos:

commit: confirma todas as operações pendentes.

rollback: desfaz todas as operações pendentes.

cursor: retorna um objeto do tipo Cursor.

close: encerra a conexão com o banco de dados.

Cursor expand_more

Classe utilizada para enviar os comandos ao banco de dados.

Principais métodos:

execute: prepara e executa a operação passada como


parâmetro.

fetchone: retorna a próxima linha encontrada por uma


consulta.

fetchall: retorna todas as linhas encontradas por uma


consulta.

A utilização desses métodos segue basicamente o mesmo fluxo de


trabalho para todas as aplicações que utilizam banco de dados.
Acompanhe a descrição desse fluxo!

Conectar

Criar uma conexão com o banco de dados utilizando a função


connect.

Executar

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 11/91


17/10/2024, 23:36 Python com banco de dados

Utilizar a conexão para criar um cursor, que será utilizado para


enviar comandos ao banco de dados.

Enviar comandos

Utilizar o cursor para enviar comandos ao banco de dados, por


exemplo:

Criar tabelas.

Inserir linhas.

Selecionar linhas.

Confirmar

Efetivar as mudanças no banco de dados utilizando o método


commit da conexão.

Fechar

Fechar o cursor e a conexão.

Observe o script a seguir, no qual temos esse fluxo de trabalho descrito


na forma de código Python.

Phyton
content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 12/91


17/10/2024, 23:36 Python com banco de dados

Script 1: Conexão com SQLite.

Agora vamos revisar o código que criamos para interagir com o banco de
dados SQLite.

cloud_download Na linha 1

Importamos o módulo sqlite3, conector para o


banco de dados SQLite disponível nativamente a
partir do Python 3.7. Atribuímos um alias (apelido) a
esse import chamado conector.

leak_add Na linha 4

Abrimos uma conexão com o banco de dados


utilizando uma URL. O retorno dessa conexão é um
objeto da classe Connection, que foi atribuído à
variável conexão.

ads_click Na linha 7

Utilizamos o método cursor da classe Connection


para criar um objeto do tipo Cursor, que foi atribuído
à variável cursor.

highlight_alt Na linha 10

Utilizamos o método execute, da classe Cursor. Este


método permite enviar comandos SQL para o banco
de dados. Entre os comandos, podemos citar:
SELECT, INSERT e CREATE.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 13/91


17/10/2024, 23:36 Python com banco de dados

settings_ethernet Na linha 11

Usamos o método fetchall, da classe Cursor, que


retorna os resultados de uma consulta.

dvr Na linha 14

Utilizamos o método commit, da classe Connection,


para efetivar todos os comandos enviados
anteriormente. Se desejássemos desfazer os
comandos, poderíamos utilizar o método rollback.

commit Nas linhas 17 e 18

Fechamos o cursor e a conexão, respectivamente.

A estrutura apresentada irá se repetir ao longo deste conteúdo.


Basicamente, preencheremos o parâmetro do método execute com o
comando SQL pertinente.

A seguir, veja o mesmo código anterior adaptado para conexão com o


MySQL e o PostgreSQL.

Python
content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 14/91


17/10/2024, 23:36 Python com banco de dados

Script 2: Conexão com MySQL.

Python content_copy

Script 3: Conexão com PostgreSQL.

Agora observe os scripts 2 e 3 e veja que ambas as bibliotecas


mysql.connector e psycopg2 contêm os mesmos métodos e funções da
biblioteca sqlite3.

Como estamos utilizando o alias conector no import, para trocar de


banco de dados, bastaria apenas alterar o import da primeira linha. Isso
porque todas elas seguem a especificação DB-API 2.0.

Comentário
Cada biblioteca tem suas particularidades, que podem atender a
funcionalidades específicas do banco de dados referenciado, mas todas
elas implementam, da mesma maneira, o básico para se trabalhar com
banco de dados. Isso é de grande utilidade, pois podemos alterar o
banco de dados a qualquer momento, sem a necessidade de realizar
muitas alterações no código-fonte.

Mais adiante, mostraremos algumas situações em que as


implementações podem diferir entre os conectores.

Principais exceções dos conectores em Python

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 15/91


17/10/2024, 23:36 Python com banco de dados

Além dos métodos, a DB-API 2.0 prevê algumas exceções que podem ser
lançadas pelos conectores.

Vamos listar e explicar algumas dessas exceções. Veja!

Error expand_more

Classe base para as exceções. É a mais abrangente.

IntegrityError expand_more

Exceção para tratar erros relacionados à integridade do banco de


dados, como falha na checagem de chave estrangeira e falha na
checagem de valores únicos. É uma subclasse de DatabaseError.

OperationalError expand_more

Exceção para tratar erros relacionados a operações no banco de


dados, mas que não estão sob controle do programador, como
desconexão inesperada. É uma subclasse de DatabaseError.

DatabaseError expand_more

Exceção para tratar erros relacionados ao banco de dados.


Também é uma exceção abrangente. É uma subclasse de Error.

ProgrammingError expand_more

Exceção para tratar erros relacionados à programação, como


sintaxe incorreta do comando SQL, tabela não encontrada etc. É
uma subclasse de DatabaseError.

NotSupportedError expand_more

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 16/91


17/10/2024, 23:36 Python com banco de dados

Exceção para tratar erros relacionados a operações não


suportadas pelo banco de dados, como chamar o método
rollback em um banco de dados que não suporta transações. É
uma subclasse de DatabaseError.

Atividade 2

Em um ambiente empresarial, garantir a integridade e a eficiência das


operações de banco de dados é fundamental para o sucesso de uma
aplicação. Portanto, após cada transação, é necessário executar um
comando de confirmação no banco de dados. Qual método é utilizado
para confirmar todas as operações pendentes em uma conexão de
banco de dados em Python?

A rollback

B execute

C fetchall

D commit

E close

Parabéns! A alternativa D está correta.

O método commit é utilizado para confirmação de todas as operações


pendentes em uma conexão de banco de dados, garantindo que as
alterações sejam salvas permanentemente.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 17/91


17/10/2024, 23:36 Python com banco de dados

Tipos de dados
Para garantir a eficiência e integridade das aplicações, é importante
entender os tipos de dados usados em bancos de dados, como inteiros,
texto e ponto flutuante. Cada tipo tem características que afetam como
são armazenados e manipulados. Escolher os tipos certos melhora o
desempenho, facilita a manutenção e assegura a compatibilidade entre
diferentes SGBDs, sendo uma habilidade essencial no mercado.

Neste vídeo, você vai aprender sobre a importância dos tipos de dados
em bancos de dados e como eles impactam o armazenamento e a
eficiência das aplicações. Descubra os diferentes tipos, como INTEGER,
TEXT, REAL e BLOB, e como escolher o correto para garantir a integridade
e o desempenho dos seus sistemas.

Cada dado armazenado em um banco de dados contém um tipo, como


inteiro, texto, ponto flutuante, entre outros.

Os tipos suportados pelos bancos de dados não são padronizados e, por


isso, é necessário verificar na sua documentação quais tipos são
disponibilizados.

O SQLite trata os dados armazenados de um modo um pouco diferente


de outros bancos, nos quais temos um número limitado de tipos.

No SQLite, cada valor armazenado no banco é de uma das classes a


seguir.

NULL

Para valores nulos.

INTEGER

Para valores que são números inteiros, com sinal.

REAL
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 18/91
17/10/2024, 23:36 Python com banco de dados

Para valores que são números de ponto flutuante.

TEXT

Para valores que são texto (string).

BLOB

Para armazenar valores exatamente como foram inseridos, ex.:


bytes.

Apesar de parecer um número limitado de classes, quando comparado


com outros bancos de dados, o SQLite suporta o conceito de afinidades
de tipo para as colunas.

No SQLite, quando definimos uma coluna durante a criação de uma


tabela, ao invés de especificar um tipo estático, dizemos qual a afinidade
dela. Isso nos permite armazenar diferentes tipos de dados em uma
mesma coluna. Observe as afinidades disponíveis.

TEXT

Coluna para armazenar dados das classes NULL, TEXT e BLOB.

NUMERIC

Coluna para armazenar dados de qualquer uma das cinco


classes.

INTEGER

Similar ao NUMERIC, diferenciando apenas no processo de


conversão de valores.

REAL

Similar ao NUMERIC, porém os valores inteiros são forçados a

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 19/91


17/10/2024, 23:36 Python com banco de dados

serem representados como ponto flutuante.

NONE

Coluna sem preferência de armazenamento, não é realizada


nenhuma conversão de valores.

A afinidade também permite ao motor do SQLite fazer um mapeamento


entre tipos não suportados e tipos suportados. Por exemplo, o
tipo VARCHAR(n), disponível no MySQL e PostgreSQL, é convertido
para TEXT no SQLite.

Esse mapeamento nos permite definir atributos no CREATE TABLE com


outros tipos, não suportados pelo SQLite. Esses tipos são convertidos
para tipos conhecidos utilizando afinidade.

A tabela de afinidades do SQLite está descrita a seguir.

Tipo no CREATE TABLE Afinidade

INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT INTEGER
BIGINT
UNSIGNED BIG INT
INT2
INT8

CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
TEXT
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB

BLOB BLOB

REAL REAL
DOUBLE

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 20/91


17/10/2024, 23:36 Python com banco de dados

Tipo no CREATE TABLE Afinidade

DOUBLE PRECISION
FLOAT

NUMERIC
DECIMAL(10,5)
BOOLEAN NUMERIC
DATE
DATETIME

Tabela: Afinidades do SQLite.


Frederico Tosta de Oliveira.

A partir dessa tabela, mesmo utilizando o SQLite para desenvolvimento,


podemos definir os atributos de nossas tabelas com os tipos que
utilizaremos em ambiente de produção.

Atividade 3

A escolha adequada dos tipos de dados é fundamental para o


desempenho e a integridade dos bancos de dados em aplicações reais.
Qual tipo de dado é usado para armazenar valores de texto em um
banco de dados SQLite?

A INTEGER

B TEXT

C BLOB

D REAL

E NUMERIC

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 21/91


17/10/2024, 23:36 Python com banco de dados

Parabéns! A alternativa B está correta.

No SQLite, o tipo de dado TEXT é utilizado para armazenar valores de


texto (strings). Isso permite o armazenamento de dados textuais de
forma eficiente e adequada, conforme suas características.

2 - Conexão, acesso e criação de banco de dados


Ao final deste módulo, você será capaz de empregar as funcionalidades para conexão,
acesso e criação de bancos de dados e tabelas.

Conexão a banco de dados e criação


de tabelas
Para um desenvolvedor, é fundamental saber conectar um script Python
a um banco de dados e criar tabelas para organizar os dados
corretamente. Isso permite definir tipos de dados, chaves primárias e
estrangeiras, garantindo a integridade dos dados e possibilitando o
desenvolvimento de sistemas robustos e escaláveis.

Neste vídeo, você aprenderá a conectar scripts Python a bancos de


dados como SQLite, PostgreSQL e MySQL, e a criar tabelas usando SQL.
Veja como implementar o comando CREATE TABLE em Python para criar
tabelas e definir chaves, garantindo a integridade dos dados. Confira!

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 22/91


17/10/2024, 23:36 Python com banco de dados

Conectando a um banco de dados

Agora vamos aprender a criar e a conectar-se a um banco de dados, criar


e editar tabelas e seus relacionamentos.

Como o SQLite trabalha com arquivo e não tem suporte à autenticação,


para se conectar a um banco de dados SQLite, basta chamar a
função connect do módulo sqlite3, passando como argumento o
caminho para o arquivo que contém o banco de dados.

Veja a sintaxe a seguir.

Phyton content_copy

Pronto! Isso é o suficiente para termos uma conexão com o banco de


dados meu_banco.db e iniciar o envio de comandos SQL para criar
tabelas e inserir registros.

Caso o arquivo não exista, ele será criado automaticamente! O arquivo


criado pode ser copiado e compartilhado.

Se quisermos criar um banco de dados em memória, que será criado


para toda execução do programa, basta utilizar o comando conexao =
sqlite3.connect(':memory:').

Criando tabelas

Agora que já sabemos como criar e se conectar a um banco de dados


SQLite, vamos começar a criar tabelas.

Antes de colocarmos a mão na massa, vamos verificar o nosso modelo


entidade relacionamento (ER) que utilizaremos para criar tabelas neste
primeiro momento. Veja o modelo!

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 23/91


17/10/2024, 23:36 Python com banco de dados

Modelo entidade relacionamento (ER).

Nosso modelo é composto por três entidades: Pessoa, Veículo e Marca.


Conheça mais sobre elas!

Pessoa expand_more

Contém estes atributos:

CPF, como chave primária.

Nome.

Nascimento, para armazenar a data de nascimento da


pessoa.

Óculos, que indica se a pessoa precisa usar óculos.

Marca expand_more

Contém estes atributos:

Id, como chave primária.

Nome.

Sigla.

Veículo expand_more

Contém estes atributos:

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 24/91


17/10/2024, 23:36 Python com banco de dados

Placa, como chave primária.

Cor.

Proprietário, que é uma referência à pessoa dona do veículo.

Marca, referência à marca do veículo.

Para os relacionamentos do nosso modelo, uma pessoa pode ter zero,


um ou mais veículos e um veículo só pode ter um proprietário. Uma
marca pode estar em zero, um ou mais veículos e um veículo só pode ter
uma marca.

Agora que já temos nosso modelo ER, precisamos definir os tipos de


cada atributo das nossas entidades. Como estamos trabalhando com
SQLite, precisamos ter em mente a tabela de afinidades do SQLite.

Vamos definir a entidade Pessoa, de forma que os atributos tenham os


seguintes tipos e restrições. Observe!

CPF

INTEGER (chave primária, não nulo).

Nome

TEXT (não nulo).

Nascimento

DATE (não nulo).

Óculos

BOOLEAN (não nulo).

Para criar uma tabela que represente essa entidade, vamos utilizar o
comando SQL.

Structured Query Language content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 25/91


17/10/2024, 23:36 Python com banco de dados

Observe pela tabela de afinidades, que os tipos DATE e BOOLEAN serão


convertidos por afinidade para NUMERIC. Na prática, os valores do tipo
DATE serão da classe TEXT e os do tipo BOOLEAN da classe INTEGER,
pois armazenaremos os valores True como 1 e False como 0.

Definido o comando SQL, vamos ver como criar essa tabela em Python
no próximo exemplo.

Python content_copy

Vamos agora analisar o passo a passo do código apresentado.

Na linha 1

Importamos o módulo sqlite3 e


atribuímos o alias conector.

Na linha 5

Conectamos ao banco de dados


meu_banco.db; se o arquivo não

i i l á i d di ói
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 26/91
17/10/2024, 23:36 Python com banco de dados
existir, ele será criado no diretório
atual do script.

Na linha 6

Criamos um cursor para executar


as operações no nosso banco.

Nas linhas 9 a 15

Definimos a variável comando,


que é uma string contendo o
comando SQL para criação da
tabela Pessoa.

Na linha 17

Utilizamos o método execute do


cursor para executar o comando
SQL passado como argumento.

Na linha 19

Efetivamos a transação
pendente utilizando o método
commit da variável conexão.
Nesse caso, a transação
pendente é a criação da tabela.

Nas linhas 22 e 23

Capturamos e tratamos a
exceção DatabaseError.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 27/91


17/10/2024, 23:36 Python com banco de dados

Nas linhas 28 e 29

Fechamos o cursor e a conexão


na cláusula finally, para garantir
que nenhuma conexão fique
aberta em caso de erro.

Observe que envolvemos todo o nosso código com a cláusula try/catch,


capturando as exceções do tipo DatabaseError.

Repare também como ficou a árvore de diretórios à esquerda da imagem


após a execução do programa. Veja que agora temos o arquivo
meu_banco.db.

Atenção!
Nos exemplos ao longo deste conteúdo, vamos utilizar a mesma
estrutura de código do script anterior, porém, vamos omitir as cláusulas
try/catch para fins de brevidade.

Agora vamos tratar de nossa próxima entidade: Marca. Vamos defini-la


de forma que os atributos tenham os seguintes tipos e restrições:

Id

INTEGER (chave primária, não nulo).

Nome

TEXT (não nulo).

Sigla

CHARACTER (não nulo, tamanho 2).

A codificação latin-1, muito utilizada no Brasil, utiliza um byte por


caractere. Como a sigla da marca será composta por 2 caracteres, nosso
atributo sigla terá tamanho 2 (CHAR(2) ou CHARACTER(2)).

Para criar uma tabela que represente essa entidade, vamos utilizar o
comando SQL.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 28/91


17/10/2024, 23:36 Python com banco de dados
Structured Query Language content_copy

Pela tabela de afinidades, o tipo CHARACTER(2) será convertido para


TEXT.

Confira o código a seguir, para verificar como ficou o script de criação


dessa tabela.

Python content_copy

Após a criação da conexão e do cursor, linhas 4 e 5, definimos uma


string com o comando SQL para criação da tabela Marca, linhas 8 a 13.

O comando foi executado na linha 15 e efetivado na linha 18.

Nas linhas 21 e 22, fechamos o cursor e a conexão.

A próxima entidade a ser criada será a entidade Veículo. Os seus


atributos terão os seguintes tipos e restrições.

Placa

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 29/91


17/10/2024, 23:36 Python com banco de dados

CHARACTER (chave primária, não nulo, tamanho 7).

Ano

INTEGER (não nulo).

Cor

TEXT (não nulo).

Proprietário

INTEGER (chave estrangeira, não nulo).

Marca

INTEGER (chave estrangeira, não nulo).

Como nossas placas são compostas por 7 caracteres, nosso atributo


placa terá tamanho 7 (CHAR(7) ou CHARACTER(7)). Por afinidade, ele
será convertido para TEXT.

O atributo proprietário será utilizado para indicar um relacionamento da


entidade Veículo com a entidade Pessoa. O atributo da tabela Pessoa
utilizado no relacionamento será o CPF. Como o CPF é um INTEGER, o
atributo relacionado proprietario também precisa ser INTEGER.

O atributo marca será utilizado para indicar um relacionamento da


entidade Veículo com a entidade Marca, por meio do atributo id da tabela
Marca, que também é um INTEGER.

Veja o comando SQL a seguir para criar a tabela Veículo e o


relacionamento com as tabelas Pessoa e Marca.

Structured Query Language content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 30/91


17/10/2024, 23:36 Python com banco de dados

Definido o comando SQL, vamos ver como criar essa tabela em Python
no exemplo a seguir.

Python content_copy

Este script também segue os mesmos passos do script anterior até a


linha 8, em que definimos a string com o comando SQL para criação da
tabela Veículo.

Esse comando foi executado na linha 19 e efetivado na linha 22.

Dica
Caso a referência da chave estrangeira seja feita a um atributo
inexistente, será lançado um erro de programação: ProgrammingError.

Para visualizar como ficaram nossas tabelas, vamos utilizar o programa


DB Browser for SQLite.

Após abrir o programa DB Browser for SQLite, basta clicar em Abrir


banco de dados e selecionar o arquivo meu_banco.db.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 31/91


17/10/2024, 23:36 Python com banco de dados

DB Browser for SQLite.

Observe que está tudo conforme o previsto, inclusive a ordem dos


atributos obedece a sequência na qual foram criados.

Atividade 1

A criação de tabelas em um banco de dados permite organizar e


estruturar dados de forma eficiente. Qual comando SQL é utilizado para
criar uma tabela no banco de dados?

A INSERT TABLE

B DELETE TABLE

C UPDATE TABLE

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 32/91


17/10/2024, 23:36 Python com banco de dados

D CREATE TABLE

E ALTER TABLE

Parabéns! A alternativa D está correta.

O comando SQL CREATE TABLE é utilizado para criar uma nova tabela
no banco de dados, especificando os nomes das colunas e os tipos de
dados para cada coluna.

Alteração e remoção de tabela


Os processos de alteração e remoção de tabelas em bancos de dados
são essenciais para manter a flexibilidade e adaptabilidade dos
sistemas. Durante o desenvolvimento, pode ser necessário ajustar
tabelas para adicionar ou remover colunas. Dominar comandos como
ALTER TABLE e DROP TABLE permite modificar o banco de dados
rapidamente à medida que o projeto evolui, mantendo o sistema eficiente
e funcional.

Neste vídeo, veremos como alterar e remover tabelas em bancos de


dados usando SQL. Adicionaremos novos atributos com ALTER TABLE e
removeremos tabelas com DROP TABLE, garantindo a flexibilidade das
estruturas de dados nas suas aplicações. Assista!

Neste momento, temos o nosso banco com as três tabelas exibidas no


modelo ER. Durante o desenvolvimento, pode ser necessário realizar
alterações no nosso modelo e, consequentemente, nas nossas tabelas.
Vamos ver agora como podemos fazer para adicionar um novo atributo
e como remover uma tabela.

Para alterar uma tabela e adicionar um novo atributo, precisamos utilizar


o comando ALTER TABLE do SQL. Para ilustrar, vamos adicionar mais

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 33/91


17/10/2024, 23:36 Python com banco de dados

um atributo à entidade Veículo. O atributo se chama motor e corresponde


à motorização do carro: 1.0, 1.4, 2.0 etc. Esse atributo deverá conter
pontos flutuantes e, por isso, vamos defini-lo como do tipo REAL.

Para alterar a tabela Veículo e adicionar a coluna motor, utilizamos o


seguinte comando SQL.

Structured Query Language content_copy

Confira o script a seguir, no qual realizamos a alteração da tabela


Veículo.

Python content_copy

Após se conectar ao banco e obter um cursor, linhas 4 e 5, construímos


uma string com o comando ALTER TABLE nas linhas 8 e 9. Na linha 11,
executamos o comando e na linha 14 efetivamos a modificação. Nas
linhas 17 e 18, fechamos o cursor e a conexão.

Observe como ficou a tabela após a criação da nova coluna.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 34/91


17/10/2024, 23:36 Python com banco de dados

DB Browser for SQLite.

Na imagem, o atributo motor foi adicionado ao final da entidade,


obedecendo a ordem de criação.

Exemplo
Em algumas situações, as colunas precisam seguir uma ordem
específica. Um cenário comum é quando carregamos dados de uma
planilha diretamente para um banco de dados, para fazer uma inserção
em massa (bulk insert). Nesses casos, as colunas da planilha devem
estar na mesma ordem das colunas do banco.

Como nem todos os bancos de dados, incluindo o SQLite, dão suporte à


criação de colunas em posição determinada, vamos precisar remover
nossa tabela para recriá-la com os atributos na posição desejada.

Para o nosso exemplo, desejamos esta sequência:

Placa

Ano

Cor

Motor

Proprietário

Marca

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 35/91


17/10/2024, 23:36 Python com banco de dados

No exemplo a seguir, vamos remover a tabela Veículo, utilizando o


comando DROP TABLE do SQL e, posteriormente, vamos criá-la
novamente com a sequência desejada.

Para remover a tabela Veículo, utilizamos o seguinte comando SQL.

Structured Query Language content_copy

Para recriar a tabela, utilizamos este comando SQL:

Structured Query Language content_copy

Veja como ficou nosso script!

Python content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 36/91


17/10/2024, 23:36 Python com banco de dados

Após se conectar ao banco e obter o cursor, criamos a string comando1


com o comando para remover a tabela Veículo, na linha 8. Na linha 10,
executamos esse comando.

Nas linhas 12 a 22, criamos o comando para criar novamente a tabela


Veículo com os atributos na ordem mostrada anteriormente e, na linha
24, executamos esse comando.

Na linha 27, efetivamos todas as modificações pendentes, tanto a


remoção da tabela, quanto a criação. Observe que não é preciso efetuar
um commit para cada comando.

Nas linhas 30 e 31, liberamos o cursor e fechamos a conexão.

Veja o resultado do nosso modelo ER!

Modelo ER.

Algumas bibliotecas de acesso a banco de dados oferecem uma


funcionalidade chamada mapeamento objeto-relacional, do inglês
object-relational mapping (ORM).

Esse mapeamento permite associar classes definidas em Python com


tabelas em banco de dados, em que cada objeto dessas classes
corresponde a um registro da tabela.

Os comandos SQL de inserções e consultas são todos realizados por


meio de métodos, não sendo necessário escrever o comando SQL em si.
Os ORM nos permitem trabalhar com um nível mais alto de abstração.

ORM
ORM (Object Relational Mapper) é uma mapeamento objeto-relacional, isto
é, uma técnica de mapeamento objeto relacional que permite fazer uma

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 37/91


17/10/2024, 23:36 Python com banco de dados

relação dos objetos com os dados que eles representam.

Exemplo
Visite as páginas das bibliotecas SQLAlchemy e Peewee e veja como
elas facilitam a manipulação de registros em banco de dados.

Atividade 2

Alterar e remover tabelas em um banco de dados ajuda a manter a


flexibilidade e a adaptabilidade das aplicações. Qual comando SQL é
utilizado para adicionar uma nova coluna a uma tabela existente?

A CREATE COLUMN

B ALTER TABLE

C ADD COLUMN

D MODIFY TABLE

E UPDATE TABLE

Parabéns! A alternativa B está correta.

O comando SQL ALTER TABLE é utilizado para modificar a estrutura de


uma tabela existente, incluindo a adição de novas colunas. Isso permite
a atualização e a expansão das tabelas conforme necessário.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 38/91


17/10/2024, 23:36 Python com banco de dados

Desenvolvendo um script Python com


conexão a banco de dados
No desenvolvimento de software moderno, é preciso criar programas
com conexão a bancos de dados, especialmente quando utilizamos
Python. Assim, as aplicações podem armazenar, recuperar e manipular
dados de maneira segura, atendendo às diversas demandas
empresariais e tecnológicas.

Bancos de dados são fundamentais para a gestão de


informações em sistemas de gerenciamento de
conteúdo, e-commerce, aplicativos financeiros, jogos e
muito mais.

Conectar uma aplicação Python a um banco de dados possibilita a


implementação de funcionalidades dinâmicas, como registro de
usuários, processamento de transações, geração de relatórios e análise
de dados.

Assista ao vídeo e aprenda a criar um script em Python para gerenciar


eventos, usando um banco de dados SQLite. Você verá como criar
tabelas, inserir dados e consultar registros.

Roteiro de prática

Você foi contratado como desenvolvedor de uma startup de tecnologia, a


qual está desenvolvendo um sistema de gerenciamento de eventos. A
aplicação precisa armazenar informações sobre eventos, participantes e
locais. Para isso, você deve criar um script em Python que se conecte a
um banco de dados SQLite e crie as tabelas necessárias.

Objetivo

Desenvolver um script em Python que:

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 39/91


17/10/2024, 23:36 Python com banco de dados

1. Conecte-se a um banco de dados SQLite.

2. Crie três tabelas: Eventos, Participantes e Locais.

3. Selecione e exiba os dados armazenados.

Agora, siga o passo a passo a seguir.

Passo 1: Conectar-se ao banco de dados

No arquivo gerenciamento_eventos.py, importe a biblioteca sqlite3.

Crie uma função para conectar-se ao banco de dados.

Python content_copy

Passo 2: Criar tabelas

Defina uma função para criar as tabelas Eventos, Participantes e Locais.

Python
content_copy

Passo 3: Montar o script principal

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 40/91


17/10/2024, 23:36 Python com banco de dados

No final do arquivo gerenciamento_eventos.py, adicione o código


principal para executar as funções definidas.

Python content_copy

Passo 4: Executar o script

1. Abra um terminal ou prompt de comando.

2. Navegue até o diretório onde o arquivo gerenciamento_eventos.py


está salvo.

3. Execute o script com o comando. Veja!

Bash content_copy

Resultado esperado

O script deve conectar-se ao banco de dados eventos.db, criar as tabelas


Locais, Eventos e Participantes, inserir os dados fornecidos e exibir os
dados das tabelas no console.

Atividade 3

Na criação de um sistema de gerenciamento de eventos, a ordem de


criação das tabelas no banco de dados é um fator importante. O que

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 41/91


17/10/2024, 23:36 Python com banco de dados

aconteceria se o desenvolvedor criasse a tabela de eventos antes da


tabela de locais?

A A tabela de eventos seria criada corretamente.

B Nada, a ordem das tabelas não importa.

A tabela de eventos criaria uma referência nula à tabela


C
de locais.

A tabela de eventos seria criada sem chaves


D
estrangeiras.

A tabela de eventos não seria criada devido à ausência


E
da tabela de locais.

Parabéns! A alternativa E está correta.

Para criar uma tabela com uma chave estrangeira, a tabela referenciada
deve existir. Portanto, tentar criar a tabela de eventos antes da tabela de
locais resultaria em um erro, pois a referência à chave estrangeira não
seria encontrada.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 42/91


17/10/2024, 23:36 Python com banco de dados

3 - Inserção, remoção e atualização de tabelas do banco de


dados
Ao final deste módulo, você será capaz de aplicar as funcionalidades para inserção, remoção
e atualização de registros em tabelas.

Inserção de dados em tabela


A partir de comandos como INSERT INTO, desenvolvedores podem
adicionar novos registros, atualizando e expandindo continuamente o
banco de dados com informações relevantes. Assim, as aplicações
podem manipular dados de maneira efetiva, suportando operações de
entrada de dados de usuários, integração de sistemas e manutenção de
registros atualizados.

Neste vídeo, você aprenderá a usar o comando SQL INSERT INTO para
inserir dados em tabelas de bancos de dados. Vamos abordar a sintaxe
correta e exemplos práticos para que suas aplicações possam adicionar
novos registros, mantendo seu banco de dados atualizado e funcional.
Confira!

Para ilustrar a utilização do comando INSERT INTO, do SQL, vamos


inserir o seguinte registro na tabela Pessoa:

CPF: 12345678900

Nome: João

Data de nascimento: 31/01/2000

Usa óculos: Sim (True)

O comando SQL para inserção desses dados é o seguinte:

Structured Query Language


content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 43/91


17/10/2024, 23:36 Python com banco de dados

Observe que alteramos a formatação da data para se adequar ao padrão


de alguns bancos de dados, como MySQL e PostgreSQL. Para o SQLite
será indiferente, pois o tipo DATE será convertido por afinidade para
NUMERIC, que pode ser de qualquer classe. Na prática, será convertido
para classe TEXT.

Além disso, utilizamos o valor “1” para representar o booleano True.


Assim como o DATE, o BOOLEAN será convertido para NUMERIC, porém,
na prática, será convertido para classe INTEGER.

Confira como ficou o script para inserção dos dados.

Python
content_copy

Após se conectar ao banco e obter o cursor, criamos a string com o


comando para inserir um registro na tabela Pessoa nas linhas 8 e 9.

Na linha 11, executamos esse comando com a execução do commit na


linha 14.

Ao final do script, fechamos o cursor e a conexão.

Observe como ficou a tabela pelo DB Browser for SQLite.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 44/91


17/10/2024, 23:36 Python com banco de dados

DB Browser for SQLite.

Atividade 1

Inserir dados em uma tabela é uma tarefa comum no desenvolvimento


de aplicações que interagem com bancos de dados. Qual comando SQL
é utilizado para inserir um novo registro em uma tabela?

A UPDATE INTO

B INSERT INTO

C ADD INTO

D CREATE INTO

E SELECT INTO

Parabéns! A alternativa B está correta.

O comando SQL INSERT INTO é utilizado para inserir novos registros


em uma tabela. Ele permite especificar as colunas e os valores a serem

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 45/91


17/10/2024, 23:36 Python com banco de dados

adicionados, garantindo que os dados sejam armazenados


corretamente.

Inserção de dados em tabela com


queries dinâmicas
A inserção de dados com queries dinâmicas é uma técnica fundamental
no desenvolvimento de aplicações flexíveis e seguras. Ela permite
reutilizar comandos SQL, alterando apenas os valores a serem inseridos,
o que facilita a manutenção do código e melhora a eficiência.

Neste vídeo, você aprenderá a usar delimitadores de parâmetros, como


“?” no SQLite, para evitar SQL Injection e aumentar a flexibilidade do seu
código, mantendo a integridade dos dados. Assista!

É muito comum reutilizarmos uma mesma string para inserir diversos


registros em uma tabela, alterando apenas os dados que serão
adicionados.

Para realizar esse tipo de operação, o método execute, da classe Cursor,


prevê a utilização de parâmetros de consulta, que é uma forma de criar
comandos SQL dinamicamente.

Comentário

De forma geral, as APIs sqlite3, psycopg2 e PyMySQL fazem a


concatenação da string e dos parâmetros antes de enviá-los ao banco de
dados.

A concatenação da string é realizada de forma correta, evitando brechas


de segurança, como SQL Injection, e convertendo os dados para os tipos
e formatos esperados pelo banco de dados.

Como resultado final, temos um comando pronto para ser enviado ao


banco de dados.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 46/91


17/10/2024, 23:36 Python com banco de dados

Para indicar que a string de um comando contém


parâmetros que precisam ser substituídos antes da sua
execução, utilizamos delimitadores. Esses
delimitadores também estão previstos na PEP 249 e
podem ser: “?”, “%s”, entre outros.

Na biblioteca do SQLite, utilizamos o delimitador “?”.

Para ilustrar a utilização do delimitador “?” em SQLite, considere o


comando a seguir.

Structured Query Language


content_copy

Esse comando indica que, ao ser chamado pelo método execute,


devemos passar dois parâmetros, um para cada interrogação. Esses
parâmetros precisam estar em um iterável, como em uma tupla ou lista.
Veja a seguir como poderia ficar a chamada do método execute para
esse comando.

Structured Query Language content_copy

A partir da string e da tupla, é montado o comando final, que é traduzido


para:

Structured Query Language


content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 47/91


17/10/2024, 23:36 Python com banco de dados

A concatenação é feita da forma correta para o banco de dados em


questão, aspas simples para textos e números sem aspas.

No exemplo a seguir, vamos detalhar a utilização de parâmetros


dinâmicos, porém, antes, vamos definir uma classe chamada Pessoa,
com os mesmos atributos da nossa entidade Pessoa.

A definição dessa classe pode ser vista no script modelo.py.

Python
content_copy

No script a seguir, temos os mesmos atributos que a entidade


equivalente, mas com nomes diferentes. Fizemos isso para facilitar o
entendimento dos exemplos dados aqui.

Python
content_copy

Primeiro, importamos o conector na linha 1 e, na linha 2, importamos a


classe Pessoa. Ela será utilizada para criar um objeto do tipo Pessoa.
Nas linhas 5 e 6, conectamos ao banco de dados e criamos um cursor.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 48/91


17/10/2024, 23:36 Python com banco de dados

Na linha 9, utilizamos o construtor da classe Pessoa para criar um objeto


com os seguintes atributos: CPF: 10000000099; Nome: Maria; Data de
nascimento: 31/01/1990 e Óculos: Não (False). O valor False será
convertido para 0 durante a execução do método execute.

Na linha 12, definimos a string que conterá o comando para inserir um


registro na tabela Pessoa. Observe como estão representados os valores
dos atributos! Estão todos com o delimitador representado pelo caractere
interrogação (?)!

Comentário
O uso do delimitador de parâmetros, representado por uma interrogação
(?), serve para indicar ao método execute que alguns parâmetros serão
fornecidos, a fim de substituir essas interrogações por valores.

Na linha 13, chamamos o método execute utilizando, como segundo


argumento, uma tupla com os atributos do objeto pessoa. Cada
elemento dessa tupla irá ocupar o lugar de uma interrogação,
respeitando a ordem com que aparecem na tupla.

Veja a seguir o comando final enviado ao banco de dados pelo comando


execute.

Structured Query Language content_copy

Na linha 16, efetivamos o comando utilizando o método commit.

Nas linhas 19 e 20, fechamos o cursor e a conexão.

Dica

Nem todos os conectores utilizam o mesmo caractere como delimitador.


Os conectores psycopg2, do PostgreSQL, e PyMySQL, do MySQL,
utilizam o “%s”. É necessário ver a documentação de cada conector para
verificar o delimitador correto.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 49/91


17/10/2024, 23:36 Python com banco de dados

Atividade 2

Escolher os delimitadores corretos para parâmetros em diferentes


conectores é uma habilidade relevante para o desenvolvimento de
aplicações. Qual delimitador é utilizado para parâmetros em queries
dinâmicas com o conector sqlite3 em Python?

A %s

B %n

C ?

D $

E &

Parabéns! A alternativa C está correta.

O delimitador ? é utilizado no conector sqlite3 para indicar parâmetros


em queries dinâmicas. Ele permite a inserção segura de valores,
evitando vulnerabilidades como SQL Injection.

Inserção de dados em tabela com


queries dinâmicas e nomes
Uma etapa essencial no desenvolvimento de aplicações eficazes é
aprender a usar queries dinâmicas com nomes. Utilizar argumentos
nomeados torna o código mais flexível e claro, facilita a manutenção e
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 50/91
17/10/2024, 23:36 Python com banco de dados

diminui a chance de erros. Além disso, essa prática melhora a segurança


contra SQL Injection, protegendo a integridade dos dados.

Neste vídeo, demonstraremos como utilizar delimitadores e dicionários


em Python para criar comandos SQL flexíveis e seguros, otimizando a
inserção de registros e prevenindo erros, como o SQL Injection. Confira!

Além da utilização do caractere “?” como delimitador de parâmetros,


o sqlite3 também possibilita a utilização de argumentos nomeados.

A utilização de argumentos nomeados funciona de forma similar à


chamada de funções utilizando os nomes dos parâmetros.

Nessa forma de construção de queries dinâmicas, ao invés de passar


uma tupla, devemos passar um dicionário para o método execute. Ele
será utilizado para preencher corretamente os valores dos atributos.

A utilização de argumentos nomeados nos permite utilizar


argumentos sem a necessidade de manter a ordem.

Para ilustrar a utilização dos argumentos nomeados em SQLite,


considere o comando a seguir.

Structured Query Language


content_copy

Esse comando indica que ao ser chamado pelo método execute,


devemos passar um dicionário com duas chaves, sendo uma “atrib1” e
outra “atrib2”. Observe que há dois pontos (“:”) antes do argumento
nomeado!

Veja agora como poderia ficar a chamada do método execute para esse
comando.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 51/91


17/10/2024, 23:36 Python com banco de dados
Structured Query Language content_copy

A partir da string e do dicionário, é montado o comando final, que é


traduzido para:

Structured Query Language


content_copy

Observe o exemplo no script seguinte. Vamos criar um similar ao


anterior, utilizando novamente a classe Pessoa. Porém, agora, o
comando para inserir um registro no banco de dados utiliza os
argumentos nomeados.

Python
content_copy

Nas linhas 5 e 6, conectamos ao banco de dados e criamos um cursor.


Na linha 9, utilizamos o construtor da classe Pessoa para criar um objeto
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 52/91
17/10/2024, 23:36 Python com banco de dados

com os seguintes atributos: CPF: 20000000099, Nome: José, Data de


nascimento: 28/02/1990 e Usa óculos: Não (False).

Nas linhas 12 e 13, definimos a string que conterá o comando para


inserir um registro na tabela Pessoa. Observe os nomes dos argumentos
nomeados: cpf, nome, data_nascimento e usa_oculos. Cada um desses
nomes deve estar presente no dicionário passado para o método
execute!

Na linha 14, chamamos o método execute utilizando, como segundo


argumento, um dicionário com os atributos do objeto pessoa, definido na
linha 9. Cada argumento nomeado do comando será substituído pelo
valor da chave correspondente do dicionário.

Aqui está o comando final enviado ao banco de dados pelo comando


execute.

Structured Query Language


content_copy

Na linha 20, efetivamos o comando utilizando o método commit.

Observe que nosso código está crescendo. Imagine se tivéssemos uma


entidade com dezenas de atributos? A chamada do método execute da
linha 14 cresceria proporcionalmente, comprometendo muito a leitura do
nosso código.

Agora vamos simplificar nosso código de forma que ele permaneça


legível, independentemente do número de atributos de uma entidade.

Dica

Quando utilizamos o comando INSERT INTO do SQL para inserir um


registro onde todos os atributos estão preenchidos, podemos suprimir o
nome das colunas no comando.

Como vamos inserir uma pessoa com todos os atributos, manteremos


apenas os argumentos nomeados no comando SQL.

No próximo exemplo, vamos simplificar mais um pouco nosso código,


removendo o nome das colunas no comando SQL e utilizando a função
interna vars do Python que converte objetos em dicionários. Observe o
script.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 53/91


17/10/2024, 23:36 Python com banco de dados

Python content_copy

Veja o resultado/saída do script anterior.

D: \Banco de dados> & C:/ python.exe "d/script12.py"


{'cpf': 30000000099, 'nome': 'Silva', 'data_nascimento': '1990-03-
30', 'usa_oculos':
True'':}

Após a criação da conexão e do cursor, criamos um objeto do tipo


Pessoa com todos os atributos preenchidos na linha 9. Observe que o
valor True do atributo usa_oculos será convertido para 1 durante a
execução do método execute.

Na linha 12, criamos o comando SQL INSERT INTO, no qual suprimimos


o nome das colunas após o nome da tabela Pessoa. Na linha 13,
utilizamos o método execute passando como segundo argumento
vars(pessoa).

A função interna vars retorna todos os atributos de um objeto na forma


de dicionário, no qual cada chave é o nome de um atributo.

Observe a saída do console, onde imprimimos o resultado de


vars(pessoa), linha 14.

Console content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 54/91


17/10/2024, 23:36 Python com banco de dados

O comando final enviado ao banco de dados pelo comando execute foi:

Structured Query Language


content_copy

Na linha 17, efetivamos a transação e ao final do script fechamos o


cursor e a conexão.

No exemplo a seguir, vamos inserir alguns registros nas outras tabelas


para povoar nosso banco de dados. Vamos utilizar a mesma lógica do
exemplo anterior, no qual utilizamos a função vars() e argumentos
nomeados.

Primeiro, vamos criar mais duas classes no nosso módulo modelo.py


para representar as entidades Marca e Veículo. Confira essas classes no
script a seguir.

Python content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 55/91


17/10/2024, 23:36 Python com banco de dados

Para inserir os registros, vamos criar este script.

Python
content_copy

No script anterior, após abrir conexão, vamos utilizar um comando


especial do SQLite na linha 4. O comando PRAGMA.

Atenção!

O comando PRAGMA é uma extensão do SQL exclusiva do SQLite,


usada para ajustar certos comportamentos internos do banco de dados.
Por padrão, o SQLite não aplica a verificação de restrições de chave
estrangeira. Isso acontece por razões históricas, já que versões
anteriores do SQLite não suportavam chaves estrangeiras.

No comando da linha 4, habilitamos a flag foreign_keys, para garantir


que as restrições de chave estrangeiras sejam checadas antes de cada
operação.

Após a utilização do comando PRAGMA e da criação de


um cursor, vamos inserir registros relacionados à
entidade Marca e Veículo no banco.

A entidade Marca é um requisito para criação de registros na tabela


Veículo, visto que a tabela Veículo contém uma chave estrangeira para a
tabela Marca, por meio do atributo Veiculo.marca, que referencia
Marca.id.

Na linha 8, escrevemos o comando de inserção de registro na tabela


Marca utilizando argumentos nomeados.
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 56/91
17/10/2024, 23:36 Python com banco de dados

Comentário

Como não iremos passar um valor para o id da marca, que é


autoincrementado, foi necessário explicitar o nome das colunas no
comando INSERT INTO. Caso omitíssemos o nome das colunas, seria
gerada uma exceção do tipo OperationalError, com a descrição indicando
que a tabela tem 3 colunas, mas apenas dois valores foram fornecidos.

Na linha 10, criamos um objeto do tipo Marca, que foi inserido no banco
pelo comando execute da linha 11.

Para criar uma referência da marca que acabamos de inserir em um


veículo, precisamos do id autoincrementado gerado pelo banco no
momento da inserção. Para isso, vamos utilizar o atributo lastrowid
do Cursor. Esse atributo armazena o id da linha do último registro
inserido no banco e está disponível assim que chamamos o método
execute do Cursor. O id da linha é o mesmo utilizado para o campo
autoincrementado.

Na linha 12, atribuímos o valor do lastrowid ao atributo id do objeto


marca1, recém-criado. Nas linhas 14 a 16, criamos mais um objeto do
tipo Marca, inserimos no banco de dados e recuperamos seu novo id.

Nas linhas 19 e 20, temos o comando para inserir registros na tabela


Veículo, também utilizando argumentos nomeados. Como vamos inserir
um veículo com todos os atributos, omitimos os nomes das colunas.

Nas linhas 21 a 24, criamos quatro objetos do tipo Veículo. Observe que
utilizamos o atributo id dos objetos marca1 e marca2 para fazer
referência à marca do veículo. Os CPF dos proprietários foram
escolhidos aleatoriamente, baseando-se nos cadastros anteriores.

Atenção!

Lembre-se de que como os atributos proprietário e marca são referências


a chaves de outras tabelas, eles precisam existir no banco! Caso
contrário, será lançada uma exceção de erro de integridade
(IntegrityError) com a mensagem “Falha na restrição de chave
estrangeira (FOREIGN KEY constraint failed)”.

Na sequência, os veículos foram inseridos no banco pelos comandos


execute das linhas 25 a 28.

Os comandos SQL gerados por esse script foram os seguintes:

Structured Query Language


content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 57/91


17/10/2024, 23:36 Python com banco de dados

Ao final do script, efetivamos as transações, fechamos a conexão e o


cursor.

Neste momento, temos os seguintes dados nas nossas tabelas. Veja!

DB Browser for SQLite.

Atividade 3

O uso de queries dinâmicas com nomes é uma prática avançada que


melhora a legibilidade e a segurança do código em aplicações que
interagem com bancos de dados. Qual é o delimitador correto para usar
argumentos nomeados em queries dinâmicas com o conector sqlite3?

A %s

B &param

C ?param

D :param

E #param

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 58/91


17/10/2024, 23:36 Python com banco de dados

Parabéns! A alternativa D está correta.

No conector sqlite3, o delimitador :param é utilizado para argumentos


nomeados em queries dinâmicas. Isso facilita a substituição de
parâmetros de forma clara e segura, evitando erros e melhorando a
legibilidade do código.

Atualização e remoção de dados em


uma tabela
Para manter a integridade e a relevância das informações em um banco
de dados, precisamos entender as operações de atualização e remoção
de dados em uma tabela. Utilizando comandos SQL como UPDATE e
DELETE, é possível modificar registros existentes e remover dados
desnecessários ou obsoletos, garantindo que o banco de dados reflita
com precisão o estado atual da aplicação. Dominar essas habilidades é
fundamental para a administração eficiente de dados e para a
implementação de funcionalidades dinâmicas em sistemas de
informação.

Neste vídeo, vamos aprender a atualizar e remover dados em tabelas


usando os comandos SQL UPDATE e DELETE. Veremos a sintaxe
correta, boas práticas e exemplos para garantir que suas operações
sejam seguras e mantenham a integridade do banco de dados. Confira!

Ao trabalharmos com banco de dados, duas operações importantes e


bastante usadas são a atualização de dados e a remoção de dados.

Atualização de dados em uma tabela

Agora que já sabemos como inserir um registro em uma tabela, vamos


aprender a atualizar os dados de um registro.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 59/91


17/10/2024, 23:36 Python com banco de dados

Para atualizar um registro, utilizamos o comando SQL UPDATE. Aqui


está sua sintaxe:

Structured Query Language content_copy

Assim como no comando INSERT, podemos montar o comando UPDATE


de três formas. Uma string sem delimitadores, uma string com o
delimitador “?” ou uma string com argumentos nomeados.

Também podemos utilizar os delimitadores na condição da cláusula


WHERE.

No exemplo a seguir, vamos mostrar como atualizar registros de uma


tabela utilizando os três métodos.

Phyton content_copy

Após a abertura da conexão, habilitamos novamente a checagem de


chave estrangeira, por meio da flag foreign_keys, ativada pelo comando
PRAGMA.

Na sequência, criamos o cursor e definimos a string do nosso primeiro


comando de atualização, em que passamos os valores de forma

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 60/91


17/10/2024, 23:36 Python com banco de dados

explícita, sem utilização de delimitadores. O string foi atribuído à variável


comando1, linha 9.

No comando1, estamos atualizando o valor do atributo óculos para 1


(verdadeiro) para TODOS os registros da tabela. Isso ocorreu porque a
cláusula WHERE foi omitida. Na linha 10, executamos o comando1. Na
linha 12, criamos um comando de UPDATE utilizando o delimitador “?”
para o valor do atributo óculos e explicitamos o valor do CPF na cláusula
WHERE.

Observe o comando executado pela linha 13.

Structured Query Language


content_copy

Ou seja, vamos alterar o valor do atributo óculos para zero (falso)


apenas para quem tem CPF igual a 30000000099.

Na linha 15, criamos mais um comando de UPDATE, dessa vez


utilizando o argumento nomeado tanto para o atributo óculos quanto
para o CPF da cláusula WHERE.

Veja a seguir o comando final enviado pela linha 16 ao banco de dados.

Structured Query Language


content_copy

Vamos alterar o valor do atributo óculos para zero (falso) para quem tem
CPF igual a 20000000099.

Na linha 19, efetivamos as transações e posteriormente fechamos o


cursor e a conexão.

Se tentássemos alterar o CPF de uma pessoa referenciada pela tabela


Veículo, seria lançada uma exceção do tipo IntegrityError, devido à
restrição da chave estrangeira.
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 61/91
17/10/2024, 23:36 Python com banco de dados

Atenção!

Cuidado ao executar um comando UPDATE sem a cláusula WHERE, pois,


dependendo do tamanho do banco de dados, essa operação pode ser
muito custosa.

Remoção de dados de uma tabela

Vamos agora aprender a remover registros de uma tabela.

Para remover um registro, utilizamos o comando SQL DELETE. Confira a


sintaxe!

Structured Query Language


content_copy

Assim como nos outros comandos, podemos montar o comando


DELETE de três formas. Uma string sem delimitadores, uma string com o
delimitador “?” ou uma string com argumentos nomeados. Todos para a
condição da cláusula WHERE.

Veja o exemplo da utilização do comando DELETE no script a seguir.

Python
content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 62/91


17/10/2024, 23:36 Python com banco de dados

Após a criação da conexão, habilitação da checagem de chave


estrangeira e aquisição do cursor, criamos o comando SQL DELETE na
linha 9, onde explicitamos o CPF da pessoa que desejamos remover do
banco.

Na linha 10, utilizamos o método execute com o comando criado


anteriormente.

Aqui está o comando final enviado ao banco de dados pelo comando


execute:

Structured Query Language


content_copy

Na linha 13, efetivamos a transação e, ao final do script, fechamos o


cursor e a conexão.

Observe que, como as outras pessoas cadastradas são referenciadas


pela tabela Veículo por meio de seu CPF, seria gerada uma exceção do
tipo IntegrityError caso tentássemos removê-las.

Atividade 4

A atualização e a remoção de dados são operações comuns em bancos


de dados, com o objetivo de manter a precisão e a integridade das
informações. Qual comando SQL é utilizado para atualizar registros em
uma tabela?

A DELETE

B INSERT

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 63/91


17/10/2024, 23:36 Python com banco de dados
C UPDATE

D SELECT

E ALTER

Parabéns! A alternativa C está correta.

O comando SQL UPDATE é utilizado para modificar os valores dos


registros existentes em uma tabela, especificando as colunas a serem
alteradas e as novas informações.

Populando as tabelas do banco de


dados na prática
Vamos aprender a preencher tabelas em bancos de dados usando
Python, o que permite inserir dados de forma segura, mantendo a
integridade e consistência das informações. Dominar essa técnica é
essencial para automatizar a carga de dados, facilitar a migração entre
sistemas e realizar testes eficazes durante o desenvolvimento de
software.

Vamos mostrar agora como conectar-se ao banco, criar tabelas para um


sistema de e-commerce e inserir dados iniciais utilizando queries
dinâmicas. Em seguida, faremos uma alteração nas queries para utilizar
parâmetros nomeados. Confira no vídeo!

Roteiro de prática

Você foi contratado por uma empresa de e-commerce para desenvolver


um sistema de gerenciamento de produtos e pedidos capaz de
armazenar informações sobre produtos, clientes e pedidos. Sua tarefa é

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 64/91


17/10/2024, 23:36 Python com banco de dados

criar um script em Python que se conecte a um banco de dados SQLite,


criar as tabelas necessárias e inserir dados iniciais.

Objetivo

Desenvolver um script em Python que:

1. Conecte-se a um banco de dados SQLite.

2. Crie três tabelas: Produtos, Clientes e Pedidos.

3. Insira dados iniciais nessas tabelas.

4. Selecione e exiba os dados armazenados.

Passo 1: Conectar-se ao banco de dados

1. No arquivo gerenciamento_ecommerce.py, importe a biblioteca


sqlite3.

2. Crie uma função para conectar-se ao banco de dados.

Python content_copy

Passo 2: Criar tabelas

Defina uma função para criar as tabelas Produtos, Clientes e Pedidos.

Python content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 65/91


17/10/2024, 23:36 Python com banco de dados

Passo 3: Inserir dados iniciais

Defina uma função para inserir dados nas tabelas.

Python
content_copy

Passo 4: Montar o script principal

No final do arquivo gerenciamento_ecommerce.py, adicione o código


principal para executar as funções definidas.

Python
content_copy

Passo 5: Executar o script

1. Abra um terminal ou prompt de comando.

2. Navegue até o diretório onde o arquivo


gerenciamento_ecommerce.py está salvo.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 66/91


17/10/2024, 23:36 Python com banco de dados

3. Execute o script com o comando:

Bash content_copy

Resultado esperado

O script deve conectar-se ao banco de dados ecommerce.db, criar as


tabelas Produtos, Clientes e Pedidos, inserir os dados fornecidos e exibir
os dados dessas tabelas no console.

Atividade 5

Durante a inserção de dados nas tabelas de um banco de dados SQLite,


é importante usar corretamente os delimitadores de parâmetros. Sendo
possível, inclusive, utilizar parâmetros nomeados. O que aconteceria se
o desenvolvedor substituísse os "?" pelos parâmetros :nome, :preco,
:estoque na inserção de Produtos mantendo o restante do código da
mesma forma?

A A inserção falharia devido a um erro de sintaxe.

A inserção funcionaria perfeitamente sem nenhuma


B
alteração adicional.

C O Python geraria uma exceção de tipo.

O código precisaria ser adaptado para passar um


D
dicionário com os valores.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 67/91


17/10/2024, 23:36 Python com banco de dados

E A ordem dos valores se tornaria irrelevante.

Parabéns! A alternativa D está correta.

Ao usar parâmetros nomeados como :nome, :preco, :estoque, é


necessário passar um dicionário com os valores correspondentes ao
método execute para que a inserção funcione corretamente.

4 - Recuperação de registros em tabelas do banco de dados


Ao final deste módulo, você será capaz de empregar as funcionalidades para recuperação
de registros em tabelas.

Seleção de registros de uma tabela


Para recuperar informações específicas e relevantes para uma aplicação,
é fundamental saber selecionar registros em um banco de dados.
Usando o comando SQL SELECT, desenvolvedores podem realizar
consultas e filtrar dados com base em condições específicas,
possibilitando a criação de relatórios e o fornecimento de dados
necessários para uma aplicação dinâmica e responsiva.

Neste vídeo, você aprenderá a usar o comando SELECT, incluindo a


cláusula WHERE para filtrar resultados, e a recuperar informações de
forma eficiente. Assista!

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 68/91


17/10/2024, 23:36 Python com banco de dados

Aprenderemos agora a recuperar os registros presentes no banco de


dados. Partiremos de consultas mais simples, utilizando apenas uma
tabela, até consultas mais sofisticadas, envolvendo os relacionamentos
entre tabelas. Vamos lá!

Para selecionar e recuperar registros de um banco de dados, utilizamos o


comando SQL SELECT. Aqui está sua sintaxe:

Structured Query Language


content_copy

Assim como nos outros comandos, podemos utilizar uma string sem
delimitadores, uma string com o delimitador “?” ou uma string com
argumentos nomeados para a condição da cláusula WHERE.

No exemplo a seguir, vamos mostrar como recuperar todos os registros


da tabela Pessoa.

Python
content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 69/91


17/10/2024, 23:36 Python com banco de dados

Veja o resultado/saída do script anterior.

D:\Banco de dados> & C:python.exe "d:Banco de


dados/script16.py"

Tipo retornado pelo fetchall():


Tipo: - Conteúdo: ('Maria', 0)
Tipo: - Conteúdo: ('João', 1)
Tipo: - Conteúdo: ('Silva', 1)

Após criar uma conexão e obter um cursor, criamos o comando SQL


SELECT na linha 8 e destacado a seguir.

Structured Query Language


content_copy

Observe que estamos selecionando todas as pessoas da tabela, visto


que não há cláusulas WHERE. Porém, estamos recuperando apenas os
dados das colunas nome e oculos.

Acompanhe agora o passo a passo da recupeção de todos os registros


da tabela Pessoa.

Executamos o comando na linha 9 e utilizamos o método fetchall


do cursor para recuperar os registros selecionados.

Atribuímos o retorno do método à variável registros.

O objeto retornado pelo método fetchall é do tipo lista, impresso


pela linha 13 e que pode ser observado pelo console.

Na linha 15, iteramos sobre os elementos retornados e, na linha 16,


imprimimos o tipo e o conteúdo dos registros.

Ao final, fechamos o cursor e a conexão.

Observe que cada registro é uma tupla, composta pelos atributos nome e
óculos da entidade Pessoa. Os registros são sempre retornados em

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 70/91


17/10/2024, 23:36 Python com banco de dados

forma de tupla, mesmo que contenham apenas um atributo.

Atenção!

Como o SQLite não cria uma transação para o comando SELECT, não é
necessário executar o commit.

Vamos criar agora uma consulta para retornar às pessoas que usam
óculos. Observe como ficou o exemplo.

Python
content_copy

Observe o resultado/saída do script anterior.

D:\Banco de dados> & C:python.exe "d:/Banco de


dados/script17.py"
cpf: <class 'int'> 12345678900
nome: <class 'str'> João
nascimento: <class 'str'> 2000-01-31
oculos: <class 'int'> 1
cpf: <class 'int'> 30000000099
nome: <class 'str'> Silva
nascimento: <class 'str'> 1990-03-30
oculos: <class 'int'> 1

Após abrir a conexão e criar um cursor, definimos o comando para


selecionar apenas as pessoas que usam óculos.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 71/91


17/10/2024, 23:36 Python com banco de dados

Para isso, definimos o comando SQL da linha 8, que, após executado,


fica da seguinte forma:

Structured Query Language content_copy

Observe que utilizamos o asterisco (*) para representar quais dados


desejamos receber. No SQL, o asterisco representa todas as colunas.

Na linha 12, recuperamos todos os dados selecionados utilizando o


fetchall, que foram iterados na linha 13.

Para cada registro retornado, que é uma tupla com os atributos CPF,
Nome, Nascimento e Óculos, nessa ordem, criamos um objeto do tipo
Pessoa na linha 14.

Foi utilizado o operador * do Python. Esse operador


“desempacota” um iterável, passando cada elemento
como um argumento para uma função ou construtor.

Como sabemos que a ordem das colunas é a mesma ordem dos


parâmetros do construtor da classe Pessoa, garantimos que vai
funcionar corretamente.

Das linhas 15 a 18, imprimimos cada atributo do registro e seu


respectivo tipo.

Ao final do script, fechamos a conexão e o cursor.

Veja que os dados dos atributos Nascimento e Óculos estão exatamente


como no banco de dados: nascimento é uma string e óculos é do tipo
inteiro.

Comentário
Se estivéssemos utilizando o banco de dados PostgreSQL com o
conector psycopg2, como os tipos DATE e BOOLEAN são suportados,
esses valores seriam convertidos para o tipo correto.

O conector sqlite3 permite realizar essa conversão automaticamente,


mas exige algumas configurações adicionais.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 72/91


17/10/2024, 23:36 Python com banco de dados

Vamos mostrar agora como fazer a conversão de datas e booleanos.

Python
content_copy

Confira o resultado/saída do script anterior.

D:\Banco de dados> & C:/python.exe "d:/Banco de


dados/script18.py"
cpf: <class 'int'> 12345678900
nome: <class 'str'> João
nascimento: <class 'datetime.date'> 2000-01-31
oculos: <class 'bool'> False
cpf: <class 'int'> 30000000099
nome: <class 'str'> Silva
nascimento: <class 'datetime.date'> 1990-03-30
oculos: <class 'bool'> False

A primeira modificação ocorre nos parâmetros da criação da conexão.


Precisamos passar o argumento PARSE_DECLTYPES para o
parâmetro detect_types da função connect. Observe como ficou a linha
4.

Isso indica que o conector deve tentar fazer uma conversão dos dados,
tomando como base o tipo da coluna declarada no CREATE TABLE.

Comentário
Os tipos DATE e TIMESTAMP já possuem conversores embutidos no
sqlite3, porém o tipo BOOLEAN não. Para informar ao conector como

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 73/91


17/10/2024, 23:36 Python com banco de dados

fazer a conversão do tipo BOOLEAN, precisamos definir e registrar a


função conversora utilizando a função interna register_converter do
sqlite3.

A função register_converter espera, como primeiro parâmetro, uma string


com o tipo da coluna a ser convertido e, como segundo parâmetro, uma
função que recebe o dado e retorna esse dado convertido.

Na linha 12, chamamos a função register_converter, passando a string


BOOLEAN e a função conv_bool (converter booleano) como argumentos.

A função conv_bool, definida na linha 9, retorna True para o caso do


dado ser 1, ou False, caso contrário. Com isso, convertemos os inteiros 0
e 1 para os booleanos True e False. O restante do script é igual ao
anterior, porém, os dados estão convertidos para o tipo correto.

Verifique a saída do console e observe os tipos dos atributos Nascimento


e Óculos. Agora são das classes date e bool!

Atividade 1

Selecionar registros em um banco de dados permite recuperar


informações necessárias. Qual cláusula é utilizada em conjunto com o
comando SELECT para filtrar registros específicos em uma tabela?

A GROUP BY

B ORDER BY

C WHERE

D HAVING

E JOIN

Parabéns! A alternativa C está correta.


https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 74/91
17/10/2024, 23:36 Python com banco de dados

A cláusula WHERE é utilizada em conjunto com o comando SELECT


para filtrar registros específicos em uma tabela com base em condições
definidas, permitindo a recuperação de dados relevantes.

Seleção de registros utilizando


junção e de registros relacionados
É importante entender como usar junções para selecionar registros de
diferentes tabelas, criando consultas mais complexas e úteis. Com o
JOIN, desenvolvedores podem combinar dados de várias tabelas,
oferecendo uma visão mais completa. Isso permite, por exemplo, listar
pessoas junto com seus veículos e marcas. A seleção de registros
relacionados é essencial para analisar dados interconectados, gerar
relatórios detalhados, alimentar dashboards e implementar
funcionalidades avançadas em aplicações.

Neste vídeo, vamos explorar como utilizar junções em SQL para


selecionar registros relacionados em bancos de dados. Vamos ver como
o comando JOIN permite combinar dados de várias tabelas, facilitando a
criação de consultas avançadas que revelam as conexões entre
diferentes entidades e oferecem uma visão detalhada das informações
armazenadas. Confira!

Seleção de registros utilizando junção

Agora, vamos aprender a buscar registros em tabelas relacionadas. No


exemplo a seguir, vamos buscar os veículos e suas respectivas marcas,
utilizando junção de tabelas.

Python
content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 75/91


17/10/2024, 23:36 Python com banco de dados

Veja o resultado/saída do script anterior.

D:Banco de dados> & C:python.exe "d:/Banco de


dados/script19_1.py"
Placa: AAA0001 , Marca: 1
Placa: BAA0002 , Marca: 1
Placa: CAA0003 , Marca: 2
Placa: DAA0004 , Marca: 2

Após abrir a conexão e obter um cursor, selecionamos todos os registros


da tabela Veículo, utilizando o comando da linha 9, executado na linha
10.

Na linha 13, recuperamos todos os registros de veículos utilizando o


método fetchall, que foram iterados na linha 14.

Na linha 15, criamos um objeto do tipo Veículo utilizando o operador * e


imprimimos os atributos Placa e Marca na linha 16.

Verifique no console que os valores do atributo marca são seus


respectivos ids, 1 e 2. Isso ocorre porque no banco de dados
armazenamos apenas uma referência à chave primária da entidade
Marca.

help

E se quisermos substituir o
id das marcas pelos seus

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 76/91


17/10/2024, 23:36 Python com banco de dados

respectivos nomes?

Resposta

Para isso, precisamos realizar uma junção


das tabelas Veículo e Marca no comando
SELECT.

O comando SELECT para junção de duas tabelas tem a seguinte sintaxe.

Structured Query Language


content_copy

Primeiro, definimos quais colunas serão retornadas utilizando a sintaxe


nome_tabela.nome_coluna, depois indicamos as tabelas que desejamos
juntar e, por último, indicamos como alinhar os registros de cada tabela,
ou seja, quais são os atributos que devem ser iguais (colN e colM).

No exemplo a seguir, vamos criar um script de forma que o Veículo tenha


acesso ao nome da Marca, não ao id.

Python
content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 77/91


17/10/2024, 23:36 Python com banco de dados

Confira a seguir o resultado/saída do script anterior.

D:\Banco de dados> & C:/python.exe "d:/Banco de


dados/script19_2.py" Placa: AAA0001 , Marca: Marca A
Placa: BAA0002 , Marca: Marca A
Placa: CAA0003 , Marca: Marca B
Placa: DAA0004 , Marca: Marca B

Após criar uma conexão e obter um cursor, definimos o comando SQL


para recuperar os dados das tabelas Veiculo e Marca de forma conjunta.

Observe o comando SQL nas linhas 9 a 12 e destacado a seguir.

Structured Query Language


content_copy

Vamos selecionar os atributos Placa, Ano, Cor, Motor e Proprietário do


veículo e juntar com o atributo nome da tabela Marca. Observe que não
vamos utilizar o atributo id da Marca.

As tuplas retornadas serão similares à seguinte: ('AAA0001',


2001, 'Prata', 1.0, 10000000099, 'Marca A')

Na linha 16, recuperamos todos os registros de veículos, que foram


iterados na linha 17. Na linha 18, criamos um objeto do tipo Veículo
utilizando o operador * e imprimimos os atributos Placa e Marca na linha
19.

Observe pelo console, que agora o atributo marca do nosso objeto do


tipo Veículo contém o nome da Marca. No próximo exemplo, vamos dar
um passo além. Vamos atribuir ao atributo Marca, do veículo, um objeto

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 78/91


17/10/2024, 23:36 Python com banco de dados

do tipo Marca. Dessa forma, vamos ter acesso a todos os atributos da


marca de um veículo.

Para isso, vamos fazer alguns ajustes no nosso modelo. Observe os


códigos a seguir.

Python content_copy

Script19_3.py.

Python content_copy

Script modelo.py.

Veja o resultado/saída do script anterior.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 79/91


17/10/2024, 23:36 Python com banco de dados

D:\Banco de dados> & C:python.exe "d:/Banco de


dados/script19_3.py"
('AAA0001', 2001, 'Prata', 1.0, 10000000099, 1, 1, 'Marca A', 'MA')
Placa: AAA0001 , Marca: Marca A
('BAA0002', 2002, 'Preto', 1.4, 10000000099, 1, 1, 'Marca A', 'MA')
Placa: BAA0002 , Marca: Marca A
('CAA0003', 2003, 'Branco', 2.0, 20000000099, 2, 2, 'Marca B', 'MB')
Placa: CAA0003 , Marca: Marca B
('DAA0004', 2004, 'Azul', 2.2, 30000000099, 2, 2, 'Marca B', 'MB')
Placa: DAA0004 , Marca: Marca B

Vamos começar pelo nosso modelo. Adicionamos o id ao construtor da


classe Marca. Essa alteração foi feita para facilitar a criação do objeto
do tipo Marca a partir da consulta no banco. Veremos o motivo mais à
frente.

No script principal, Script modelo.py , iniciamos o script com a abertura


da conexão e criação do cursor.

Na sequência, na linha 9, criamos o comando SQL SELECT para retornar


todas as colunas da tabela Veiculo e Marca, utilizando junção.

Na linha 11, executamos esse comando e os resultados da consulta


foram recuperados na linha 14.

Na linha 15, iteramos sobre os registros recuperados.

Na linha 16, imprimimos cada tupla do registro da forma como


foram retornados pelo conector. Vamos destacar um exemplo a
seguir, que também pode ser observado no console. ('AAA0001',
2001, 'Prata', 1.0, 10000000099, 1, 1, 'Marca A', 'MA')

Na linha 17, utilizamos array slice para selecionar apenas os atributos da


Marca. O resultado do slice para o exemplo anterior é a tupla (1, 'Marca
A', 'MA'), que inclui os atributos Id, Nome e Sigla. Essa tupla é utilizada
em conjunto com o operador * para criar um objeto do tipo Marca. Como
agora temos acesso ao id da Marca, foi necessário adicionar o id ao
construtor da classe Marca.

Para ilustrar, após o slice e desempacotamento, a linha 17 pode ser


traduzida para o seguinte código:

Structured Query Language


content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 80/91


17/10/2024, 23:36 Python com banco de dados

Na linha 18, utilizamos array slice para selecionar apenas os atributos do


Veículo, que retornou a tupla ('AAA0001', 2001, 'Prata', 1.0,
10000000099), que incluiu os atributos Placa, Ano, Cor, Motor e
Proprietário. Observe que removemos o id da Marca no slice. Fizemos
isso, pois ele será substituído pelo objeto marca criado na linha 17.

Após o slice e desempacotamento, a linha 18 pode ser traduzida para o


seguinte código:

Structured Query Language content_copy

Na linha 19, imprimimos a placa do veículo e o nome da marca. Note que


o atributo marca, do objeto Veiculo, faz referência ao objeto Marca,
permitindo acessar veiculo.marca.nome. Ao final do script, encerramos a
conexão e o cursor.

Seleção de registros relacionados

Para finalizar, vamos recuperar todas as pessoas, com seus respectivos


veículos e marcas.

Para isso, vamos transformar o script anterior em uma função,


permitindo sua reutilização no nosso script final. Confira os scripts a
seguir.

Python content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 81/91


17/10/2024, 23:36 Python com banco de dados

Script19_4.py.

Python
content_copy

Script20.py.

Aqui está o resultado/saída do script anterior:

D:Banco de dados> & C:python.exe "d:Banco de


dados/script20.py"
Maria
AAA0001 Marca A
BAA0002 Marca A

José
CAA0003 Marca B

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 82/91


17/10/2024, 23:36 Python com banco de dados

Silva
DAA0004 Marca B

No script 19_4 utilizamos como base o script do exemplo anterior para


criar uma função que retorne uma lista dos veículos de determinada
pessoa.

Essa função tem como parâmetro uma conexão e o CPF de uma pessoa.
Esse CPF será utilizado para filtrar os veículos que ela possui. Para isso,
utilizamos o delimitador “?” na linha 11 e passamos o cpf da pessoa
como argumento para o comando execute da linha 14.

Na linha 15, criamos uma lista vazia, chamada veículos. Essa lista será
povoada com os veículos recuperados pela consulta ao longo do laço for
das linhas 17 a 20.

Ao final, fechamos o cursor e retornamos a lista veículos.

O script20 é o nosso script principal, destinado a gerar


uma lista das pessoas cadastradas no banco de dados,
incluindo seus veículos e marcas.

Após estabelecer a conexão e o cursor, criamos o comando SQL na linha


10 para recuperar as pessoas, e o executamos na linha 11. Na linha 14,
criamos a variável do tipo lista chamada Pessoas, e na linha 15,
utilizamos a função fetchall do cursor para recuperar todos os registros
das pessoas.

Na linha 16, iteramos pelas pessoas recuperadas e para cada uma,


criamos um objeto do tipo Pessoa (linha 17) e recuperamos seus
veículos (linha 18). Para recuperar os veículos, utilizamos a função
recuperar_veiculos do script 19_4, passando como argumento a conexão
criada na linha 6 e o CPF da pessoa.

Na linha 19, adicionamos cada pessoa à lista Pessoas criada


anteriormente. Na linha 21, iteramos sobre a lista Pessoas e imprimimos
seu nome e a lista de veículos que possui. Ao final, fechamos a conexão
e o cursor.

Recomendação

Verifique a saída do console que está logo após a imagem.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 83/91


17/10/2024, 23:36 Python com banco de dados

Atividade 2

A seleção de registros usando junções é uma técnica avançada que


permite combinar dados de várias tabelas. Qual comando SQL é
utilizado para mesclar registros de duas ou mais tabelas?

A UNION

B JOIN

C INTERSECT

D CONNECT

E MERGE

Parabéns! A alternativa B está correta.

O comando SQL JOIN é utilizado para combinar registros de duas ou


mais tabelas com base em uma condição de relação, sendo essencial
para recuperar dados de diferentes tabelas, possibilitando consultas
complexas e detalhadas.

Demonstrando como selecionar


dados no banco de dados
Dominar a seleção de dados relacionados e o uso de JOIN é
fundamental para quem trabalha com bancos de dados, especialmente
em aplicações complexas. O comando JOIN permite combinar dados de
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 84/91
17/10/2024, 23:36 Python com banco de dados

várias tabelas, oferecendo uma visão completa das informações. Isso


facilita a geração de relatórios detalhados, análises abrangentes e o
desenvolvimento de funcionalidades que dependem de dados
interconectados. Além disso, o uso eficiente de JOINs melhora o
desempenho das consultas, tornando o sistema mais eficiente.

Aprenda a usar JOIN para selecionar dados relacionados em bancos de


dados assistindo ao vídeo a seguir. Revisaremos como criar tabelas e
inserir dados iniciais. Em seguida, faremos consultas avançadas para
obter informações mais completas, essenciais para relatórios e análises.

Roteiro de prática

Você foi contratado por uma livraria on-line para desenvolver um sistema
de gerenciamento de pedidos capaz de armazenar informações sobre
livros, clientes e pedidos.

Sua tarefa é desenvolver um script em Python que se conecte a um


banco de dados SQLite, crie as tabelas necessárias, insira dados iniciais
utilizando parâmetros nomeados e demonstre a seleção de dados
relacionados usando JOIN, para obter informações completas sobre os
pedidos, incluindo detalhes dos livros e clientes.

Objetivo

Desenvolver um script em Python que:

Conecte-se a um banco de dados SQLite.

Crie três tabelas: Livros, Clientes e Pedidos.

Insira dados iniciais nessas tabelas usando parâmetros nomeados.

Utilize JOIN para selecionar e exibir dados relacionados sobre os


pedidos.

Passo 1: Definir as classes

No arquivo gerenciamento_livraria.py, defina as classes Livro, Cliente e


Pedido.

Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 85/91
17/10/2024, 23:36 Python com banco de dados

Passo 2: Conectar-se ao banco de dados

Importe a biblioteca sqlite3 e crie uma função para conectar-se ao banco


de dados.

Python content_copy

Passo 3: Criar tabelas

Defina uma função para criar as tabelas Livros, Clientes e Pedidos.

Python
content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 86/91


17/10/2024, 23:36 Python com banco de dados

Passo 4: Inserir dados iniciais com parâmetros nomeados

Defina uma função para inserir dados nas tabelas usando parâmetros
nomeados.

Python
content_copy

Passo 5: Selecionar e exibir dados relacionados utilizando JOIN

Defina uma função para selecionar e exibir os dados relacionados das


tabelas utilizando JOIN.

Python
content_copy

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 87/91


17/10/2024, 23:36 Python com banco de dados

Passo 6: Montar o script principal

No final do arquivo gerenciamento_livraria.py, adicione o código principal


para executar as funções definidas.

Python
content_copy

Passo 7: Executar o script

1. Abra um terminal ou prompt de comando.

2. Navegue até o diretório onde o arquivo gerenciamento_livraria.py


está salvo.

3. Execute o script com o comando:

Bash
content_copy

Resultado esperado

O script deve conectar-se ao banco de dados livraria.db, criar as tabelas


Livros, Clientes e Pedidos, inserir os dados fornecidos usando
parâmetros nomeados e exibir os dados dos pedidos no console,
mostrando informações detalhadas sobre os clientes e os livros
relacionados a cada pedido.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 88/91


17/10/2024, 23:36 Python com banco de dados

Atividade 3

Geralmente, o JOIN é acompanhado pela palavra ON e pela definição de


uma igualdade que representa a relação. No exemplo estudado, o que
aconteceria se o desenvolvedor invertesse a ordem para JOIN Clientes
ON Clientes.id = Pedidos.cliente_id na função exibir_pedidos?

A A consulta falharia devido a um erro de sintaxe.

B A consulta retornaria resultados diferentes.

A consulta retornaria os mesmos resultados


C
corretamente.

D A consulta executaria mais lentamente.

E A consulta geraria uma exceção de tipo.

Parabéns! A alternativa C está correta.

A ordem dos elementos em uma cláusula JOIN (tabela.coluna =


tabela.coluna) não afeta o resultado final da consulta. Ambas as
formas são sintaticamente corretas e retornam os mesmos resultados.

O que você aprendeu neste


conteúdo?
Principais conectores de SGBD em Python.

Métodos e exceções de conectores.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 89/91


17/10/2024, 23:36 Python com banco de dados

Conexão, acesso e criação de bancos de dados.

Operações CRUD em bancos de dados.

Explore +
Confira as indicações que separamos para você!

Leia a documentação da biblioteca sqlite3, fundamental para a conexão


do Python com banco de dados SQLite. Disponível na página do
desenvolvedor.

Leia a documentação da biblioteca psycopg2, disponível no site do


desenvolvedor, uma das bibliotecas mais usadas para a conexão do
Python com banco de dados PostgreSQL.

Visite o site do projeto mysql-connector-python, um dos conectores


necessários para que a conexão de uma aplicação Python com o banco
de dados MySQL seja possível.

Confira também o projeto mysqlclient, outro conector necessário para


realizar a conexão de uma aplicação Python com o banco de dados
MySQL.

Explore o site do projeto PyMySQL, outro conector utilizado para a


conexão de uma aplicação Python com o banco de dados MySQL.

Referências
HIPP, R. D. SQLite. SQLite. Consultado na internet em: 8 out. 2020.

MYSQL. MySQL Connector. Consultado na internet em: 8 out. 2020.

PSYCOPG. Psycopg2. Consultado na internet em: 8 out. 2020.

PYTHON. Python Software Foundation. Consultado na internet em: 8


out. 2020.

SQLITEBROWSER. DB Browser for SQLite. Consultado na internet em: 8


out. 2020.

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 90/91


17/10/2024, 23:36 Python com banco de dados

Material para download


Clique no botão abaixo para fazer o download do
conteúdo completo em formato PDF.

Download material

O que você achou do conteúdo?

Relatar problema

https://stecine.azureedge.net/repositorio/00212ti/00921/index.html?brand=w yden# 91/91

Você também pode gostar