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

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