TREINAMENTO
BANCO DE DADOS COM PYTHON
Júlia Rizza
contato@juliarizza.com
banco de dados?
Banco de dados?
Dados: informações em sua forma bruta (pura).
Banco de dados: coleção de dados inter relacionados, um agrupamento.
PLANEJANDO UM BD
Seguimos padrões para modelar um banco de dados antes de criá-lo: usamos diagramas que irão representar nossos dados e a forma como eles estão organizados e relacionados entre si.
Estrutura do db
TIPO
CAMPO/COLUNA
{
TABELA
DIA: https://sourceforge.net/projects/dia-installer/
SQL Designer: http://ondras.zarovi.cz/sql/demo/
SGBD
Sistemas de Gerenciamento de Banco de Dados
É o sistema que utilizamos para criar e gerenciar nossos banco de dados, para que estejam organizados e que possamos operar com eles seguindo o padrão CRUD: create, read, update e delete.
A partir dele, temos uma maneira fácil de criar o banco de dados da maneira que planejamos nos diagramas!
SQL
É a "linguagem" utilizada para passar comandos para o banco de dados.
## Criando um banco de dados
CREATE DATABASE loja;
## Criando uma tabela
CREATE TABLE produtos (
id int PRIMARY KEY,
nome varchar(255),
quantidade int,
preco float
);
CREATE TABLE clientes (
id int PRIMARY KEY,
nome varchar(255),
idade int,
cpf varchar(255)
);
## Criando um relacionamento
CREATE TABLE vendas(
id int,
id_produto int,
id_cliente int,
FOREIGN KEY(id_produto) REFERENCES produtos(id),
FOREIGN KEY(id_cliente) REFERENCES clientes(id)
);
## CRUD
## CREATE
INSERT INTO clientes (nome, idade, cpf) VALUES ('Fulano', 20, '000.000.000-00');
## READ
SELECT nome, idade FROM clientes WHERE id=1;
## UPDATE
UPDATE clientes SET nome='Ciclano', cpf='111.111.111-11' WHERE id=1;
## DELETE
DELETE FROM clientes WHERE id=2;
E NO PYTHON?
Para trabalhar com banco de dados no Python não utilizamos um SGBD, mas sim fazemos tudo por meio de código. Para isso, temos que importar a biblioteca do banco de dados que queremos utilizar.
import MySQLdb
import sqlite
import cx_Oracle
import psycopg2
conectando
A primeira etapa para se trabalhar com um banco de dados é conectar-se a ele. Ou seja, ele precisa já existir de alguma forma (você pode criá-lo por SQL puro ou por um SGBD).
import sqlite
con = sqlite.connect('loja.db')
import psycopg2
con = psycopg2.connect(host='localhost', user='postgres',
password='postgres',dbname='loja')
cursor
Cursor é o nome do intermediário entre a linguagem de programação e o seu banco de dados. Ele é quem vai interagir com o bd quando você quiser passar algum comando.
# sqlite
cursor = con.cursor()
# psycopg2
cursor = con.cursor()
EXECUTANDO COMANDOS
Após criado o cursor, todos os comandos SQL que desejamos executar podem ser passados com o comando execute().
# sqlite
cursor.execute("INSERT INTO clientes (nome, idade) VALUES ('Fulano', 20)")
# psycopg2
cursor.execute("INSERT INTO clientes (nome, idade) VALUES ('Fulano', 20)")
RECEBENDO RESULTADOS
Alguns comandos SQL dão um retorno para o programa, como o SELECT, que irá retornar todos os registros selecionados. Para receber estes registros, podemos usar fetchone e fetchall.
# sqlite
cursor.execute("SELECT * FROM clientes")
primeiro_cliente = cursor.fetchone()
todos_os_clientes = cursor.fetchall()
# psycopg2
cursor.execute("SELECT * FROM clientes")
primeiro_cliente = cursor.fetchone()
todos_os_clientes = cursor.fetchall()
COMMIT
Sempre que fazemos uma alteração no banco de dados é importante realizar um commit para gravar as alterações.
# sqlite
cursor.execute("INSERT INTO clientes (nome, idade) VALUES ('Fulano', 20)")
con.commit()
# psycopg2
cursor.execute("INSERT INTO clientes (nome, idade) VALUES ('Fulano', 20)")
con.commit()
SQL INJECTION
SQL Injection é uma prática que explora falhas no SQL. A ideia é que, quando o usuário faz um comando SQL que recebe valores externos, estes valores contenham um código SQL que será executado simultaneamente, podendo causar prejuízos ao banco de dados.
# sqlite
cursor.execute("INSERT INTO clientes
(nome, idade) VALUES
(%s, %d)" % ("Fulano", 20)) # perigoso
con.commit()
# sqlite
cursor.execute("INSERT INTO clientes
(nome, idade) VALUES
(?,?)", "Fulano", 20) # seguro
con.commit()
fechando conexões
É uma boa prática fechar um cursor e uma conexão ao banco de dados quando eles não são mais necessários, mostrando que finalizamos nosso uso.
# sqlite
cursor.close()
con.close()
# psycopg2
cursor.close()
con.close()
orm
Uma ORM (object-relational mapper) é uma ferramenta que trabalha como um "tradutor" de código. Basicamente, ela nos permite trabalhar com o banco de dados com uma linguagem que não seja SQL. Por exemplo, podemos criar uma tabela com código Python, e esta ORM irá ler este código e aplicar os comandos no db.
ORMs são ferramentas de grande poder de abstração.
SQLALCHEMY
SQLAlchemy é uma das ORMs mais famosas que temos que se integra com Python. Vamos fazer algumas das mesmas interações que realizamos antes com SQL puro:
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
Base = declarative_base()
class Cliente(Base):
__tablename__ = 'clientes'
id = Column(Integer, primary_key=True)
nome = Column(String(250), nullable=False)
idade = Column(Integer, default=0)
cpf = Column(String(250), nullable=False)
engine = create_engine('sqlite:///exemplo.db')
Base.metadata.create_all(engine)
db.py
SQLALCHEMY
from sqlalchemy import create_engine, and_
from sqlalchemy.orm import sessionmaker
from db import Cliente
engine = create_engine('sqlite:///exemplo.db')
DBSession = sessionmaker(bind=engine)
session = DBSession()
# INSERT
novo_cliente = Cliente(nome='Fulano', idade=17, cpf='000.000.000-00')
session.add(novo_cliente)
session.commit()
outro.py
SQLALCHEMY
# SELECT
clientes = session.query(Cliente).filter(Cliente.idade == 20).all()
# [<db.Cliente object at 0x2ee3cd0>]
cliente = session.query(Cliente).filter(Cliente.idade == 20).first()
# [<db.Cliente object at 0x2ee3cd0>]
n = cliente.nome
# n = Fulano
# UPDATE
cliente = session.query.filter(and_(Cliente.nome == 'Fulano',
Cliente.idade == 17)).first()
cliente.idade = 20
session.commit()
# DELETE
cliente = session.query.filter(Cliente.nome == 'Fulano').first()
session.delete(cliente)
outro.py
TREINAMENTO
banco de dados com python
Júlia Rizza
contato@juliarizza.com
Treinamento Banco de Dados - LIT
By Júlia Rizza
Treinamento Banco de Dados - LIT
- 1,208