database-schema

Fala pessoal blz? No post de hoje vamos trocar uma ideia sobre a biblioteca ORM SQLALCHEMY utilizada com python para manipulação de bancos de dados. E aí, bora aprender algo novo?

Se você ainda não viu POST de INTRODUÇÃO AO SQLALCHEMY recomendo começar seus estudos por ele caso ainda não tenha nenhum contato com esse framework incrivel. Caso, você só queira ver a parte relacionado ao uso desse framework mais voltado a manipulação de dados usando Orientação a Objetos então, te recomendo a continuar a leitura a seguir…

EM CONSTRUÇÃO… NÃO CONSIDERAR TUDO A SEGUIR POIS ESTÁ SENDO ATUALIZADO…

from rich import print #Biblioteca utilizada para dar mais vida ao terminal do computador
from rich.console import Console # faz parte da biblioteca acima
console = Console()
from sqlalchemy.exc import SQLAlchemyError #USAMOS ESSE OBJETO DA BIBLIOTECA SQLACHEMY PARA RECUPERAR OS ERROS QUE PODEM OCORRER DURANTE AS INTERAÇÕES COM O BANCO DE DADOS
from sqlalchemy import inspect #USAMOS ESSE OBJETO DA BIBLIOTECA SQLACHEMY PARA VERIFICAR SE ALGUMA TABELA NOSSA QUE DESEJAMOS CRIAR JÁ POSSA EXISTIR E PODERMOS TOMAR ALGUMA DECISÃO QUANTO A ISSO
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import datetime
database_url = 'sqlite:///teste.db'
engine = create_engine(database_url, echo=True)
engine
Engine(sqlite:///teste.db)
from sqlalchemy import Column, Integer, String, Float, Date, ForeignKey
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import relationship

# declarative base class
Base = declarative_base()

# an example mapping using the base
class Funcionario(Base):
    __tablename__ = "funcionarios"

    id = Column(Integer, primary_key=True)
    nome = Column(String)
    idade = Column(Integer)
    salario = Column(Float)
    
    def __repr__(self): # show collumn values in some object that represent a table from database
        return f"Funcionario(id={self.id}, nome={self.nome}, idade={self.idade}, salario={self.salario})"

class Departamento(Base):
    __tablename__ = "departamentos"
    id = Column(Integer, primary_key=True)
    nome = Column(String)
    
    def __repr__(self):
        return f"Departamento(id={self.id}, nome={self.nome})"
    

class Trabalha(Base):
    __tablename__ = "trabalha"
    id = Column(Integer, primary_key=True)
    id_funcionario = Column(Integer, ForeignKey("funcionarios.id"))
    id_departamento = Column(Integer, ForeignKey("departamentos.id"))
    data_entrada = Column(String)
    data_saida = Column(String)
    
    def __repr__(self):
        return f"Funcionario(id={self.id}, id_funcionario={self.id_funcionario}, id_departamento={self.id_departamento}, data_entrada={self.data_entrada}, data_saida={self.data_saida})"
    
#Base.metadata.create_all(engine)
from sqlalchemy import select
# Criando uma sessão (add, commit, query, etc).
Session = sessionmaker(engine)
# verbose version of what a context manager will do
with Session() as session:
    session.begin()
    try:
        funcionarios = session.scalars(select(Funcionario)).all()
        for f in funcionarios:
            print(f)
    except:
        session.rollback()
        raise
    else:
        session.commit()
2023-02-07 21:56:53,947 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-02-07 21:56:53,952 INFO sqlalchemy.engine.Engine SELECT funcionarios.id, funcionarios.nome, funcionarios.idade, funcionarios.salario 
FROM funcionarios
2023-02-07 21:56:53,954 INFO sqlalchemy.engine.Engine [generated in 0.00179s] ()
Funcionario(id=1, nome=Hephzibah, idade=38, salario=306.261)
Funcionario(id=2, nome=Paxon, idade=65, salario=428.725)
Funcionario(id=3, nome=Rafael, idade=48, salario=50000)
Funcionario(id=5, nome=Elyse, idade=39, salario=480.426)
Funcionario(id=6, nome=Ira, idade=21, salario=186.163)
Funcionario(id=7, nome=Mattias, idade=43, salario=344.029)
Funcionario(id=8, nome=Tybalt, idade=57, salario=363.227)
Funcionario(id=9, nome=Sully, idade=40, salario=282.221)
Funcionario(id=10, nome=Wrennie, idade=41, salario=122.309)
Funcionario(id=11, nome=Anatol, idade=60, salario=176.018)
Funcionario(id=12, nome=Craggie, idade=69, salario=201.606)
Funcionario(id=13, nome=Aila, idade=20, salario=358.59)
Funcionario(id=14, nome=Marylin, idade=40, salario=163.559)
Funcionario(id=15, nome=Moselle, idade=48, salario=306.284)
Funcionario(id=16, nome=Raleigh, idade=23, salario=430.375)
Funcionario(id=17, nome=Tracey, idade=31, salario=109.874)
Funcionario(id=18, nome=Olenolin, idade=40, salario=190.977)
Funcionario(id=19, nome=Myranda, idade=49, salario=324.872)
Funcionario(id=20, nome=Filberto, idade=24, salario=362.89)
Funcionario(id=21, nome=Calvin, idade=37, salario=498.879)
2023-02-07 21:56:53,996 INFO sqlalchemy.engine.Engine COMMIT
from sqlalchemy import select
# Criando uma sessão (add, commit, query, etc).
Session = sessionmaker(engine)
# verbose version of what a context manager will do
with Session() as session:
    session.begin()
    try:
        departamentos = session.scalars(select(Departamento)).all()
        for d in departamentos:
            print(d)
    except:
        session.rollback()
        raise
    else:
        session.commit()
2023-02-07 21:56:54,020 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-02-07 21:56:54,023 INFO sqlalchemy.engine.Engine SELECT departamentos.id, departamentos.nome 
FROM departamentos
2023-02-07 21:56:54,024 INFO sqlalchemy.engine.Engine [generated in 0.00162s] ()
Departamento(id=1, nome=Human Resources)
Departamento(id=2, nome=Services)
Departamento(id=3, nome=Product Management)
Departamento(id=4, nome=Support)
Departamento(id=5, nome=Business Development)
Departamento(id=6, nome=Services)
Departamento(id=7, nome=Human Resources)
Departamento(id=8, nome=Support)
Departamento(id=9, nome=Engineering)
Departamento(id=10, nome=Services)
2023-02-07 21:56:54,045 INFO sqlalchemy.engine.Engine COMMIT
from sqlalchemy import select
# Criando uma sessão (add, commit, query, etc).
Session = sessionmaker(engine)
# verbose version of what a context manager will do
with Session() as session:
    session.begin()
    try:
        
        trabalha = session.scalars(select(Trabalha)).all()
        for t in trabalha:
            print(t)
    except:
        session.rollback()
        raise
    else:
        session.commit()
2023-02-07 21:56:54,099 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-02-07 21:56:54,102 INFO sqlalchemy.engine.Engine SELECT trabalha.id, trabalha.id_funcionario, trabalha.id_departamento, trabalha.data_entrada, trabalha.data_saida 
FROM trabalha
2023-02-07 21:56:54,104 INFO sqlalchemy.engine.Engine [generated in 0.00128s] ()
Funcionario(id=1, id_funcionario=1, id_departamento=4, data_entrada=7/8/2022, data_saida=10/8/2021)
Funcionario(id=2, id_funcionario=2, id_departamento=5, data_entrada=1/10/2022, data_saida=3/14/2022)
Funcionario(id=3, id_funcionario=3, id_departamento=7, data_entrada=3/3/2021, data_saida=6/24/2021)
Funcionario(id=4, id_funcionario=4, id_departamento=10, data_entrada=1/4/2022, data_saida=11/27/2021)
Funcionario(id=5, id_funcionario=5, id_departamento=3, data_entrada=5/20/2022, data_saida=2/20/2021)
Funcionario(id=6, id_funcionario=6, id_departamento=5, data_entrada=9/7/2021, data_saida=10/11/2022)
Funcionario(id=7, id_funcionario=7, id_departamento=6, data_entrada=5/29/2021, data_saida=7/11/2022)
Funcionario(id=8, id_funcionario=8, id_departamento=5, data_entrada=2/18/2022, data_saida=5/28/2022)
Funcionario(id=9, id_funcionario=9, id_departamento=3, data_entrada=3/17/2022, data_saida=None)
Funcionario(id=10, id_funcionario=10, id_departamento=9, data_entrada=1/31/2022, data_saida=10/11/2021)
Funcionario(id=11, id_funcionario=11, id_departamento=9, data_entrada=2/6/2022, data_saida=None)
Funcionario(id=12, id_funcionario=12, id_departamento=2, data_entrada=9/28/2021, data_saida=None)
Funcionario(id=13, id_funcionario=13, id_departamento=6, data_entrada=2/28/2021, data_saida=4/6/2022)
Funcionario(id=14, id_funcionario=14, id_departamento=5, data_entrada=11/25/2022, data_saida=None)
Funcionario(id=15, id_funcionario=15, id_departamento=10, data_entrada=8/8/2021, data_saida=6/16/2021)
Funcionario(id=16, id_funcionario=16, id_departamento=5, data_entrada=8/1/2022, data_saida=None)
Funcionario(id=17, id_funcionario=17, id_departamento=1, data_entrada=5/26/2022, data_saida=None)
Funcionario(id=18, id_funcionario=18, id_departamento=6, data_entrada=11/13/2021, data_saida=None)
Funcionario(id=19, id_funcionario=19, id_departamento=8, data_entrada=6/22/2022, data_saida=12/11/2022)
Funcionario(id=20, id_funcionario=20, id_departamento=5, data_entrada=2/19/2021, data_saida=7/11/2022)
Funcionario(id=21, id_funcionario=21, id_departamento=1, data_entrada=9/7/2021, data_saida=None)
2023-02-07 21:56:54,159 INFO sqlalchemy.engine.Engine COMMIT