Apuntes_Python/01_curso/Modulo_4/4-4b_add_sqlalchemy.py
2022-12-24 22:41:20 -03:00

88 lines
2.2 KiB
Python

"""
Guardar Objetos en la Base de Datos
con ORM de SQLAlchemy
"""
# Mapeo de los Modelos con la BD usando el ORM de SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Sequence
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Author(Base):
__tablename__ = 'author'
id = Column(Integer, Sequence('author_id_seq'), primary_key=True)
firstname = Column(String)
lastname = Column(String)
def __repr__(self):
return "{} {}".format(self.firstname, self.lastname)
"""
Creacción del esquema CREATE_ALL
"""
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
"""
Agregando objetos a DB, flush automatico al hacer
una consulta posterior a SESSION.ADD
"""
author = Author(firstname="Juanita", lastname='Leon')
session.add(author)
our_author = session.query(Author).filter_by(firstname='Juanita').first()
# son la misma instancia
print(author is our_author, '\n')
"""
Agregar lista de objetos a la DB, SESION.ADD_ALL
"""
session.add_all([Author(firstname='Joél Ez', lastname='Silva'),
Author(firstname='Jorge', lastname='Olivares')])
"""
SESSION.NEW
Aun no estan guardados en la base, pero están en la sesión
"""
print(session.new)
# Modificando objeto en sesión, ver con SESSION.DIRTY
author.firstname = 'Anita'
print(session.dirty, '\n')
"""
SESSION.COMMIT
Enviar todos los cambios a la BD
Se devuelve la conexión al pull de conexiones.
Una vez insertados. Todos identificadores y
valores por defecto generados
por la BD están disponibles en instancia
"""
session.commit()
print(author.id, '\n')
"""
ROLLBACK
Podemos hacer rollback de todos los cambios
no incluidos en un commit
"""
author.firstname = 'Ruben'
another_author = Author(firstname='Uriel', lastname='Alelias')
session.add(another_author)
res = session.query(Author).filter(Author.firstname.in_(['Ruben', 'Uriel'])).all()
print(res, '\n')
session.rollback()
print(author.firstname)
# another_author no está en sesión, producto del rollback
print(another_author in session)