""" 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)