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.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
engine = create_engine(database_url, echo=True)
engine
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)
# 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,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)
# 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,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)
# 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,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)