88 lines
2.2 KiB
Python
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)
|