SQLAlchemy es un Object-Relational Mapper / Mapping-tool, o un ORM, es decir, una librería que los desarrolladores utilizan para crear bases de datos y manipular sus datos sin la necesidad de conocer / usar SQL.
Existen otras alternativas como SQL Alchemy o Peewee, y otros lenguajes tienen sus propios ORMs como PHP Eloquent o Java Hibernate.
Los ORM han ganado popularidad debido a que lidiar con el lenguaje SQL directamente requiere de mucho esfuerzo en la mayoría de los casos. El objetivo del ORM entonces es simplificar la mantención de tus datos. Esto se hace creando objetos para tratar con las interacciones de la base de datos.
Básicamente, con ORM no tendrás que escribir SQL otra vez (95% del tiempo) y podrás trabajar con objetos.
Para insertar un usuario con SQL tienes que escribir:
1INSERT INTO user (name, last_name) VALUES ('Juan', 'McDonals');
Con un ORM tu código sigue siendo un código familiar como este:
1user = User() 2user.name = 'Juan' 3user.last_name = 'McDonals' 4 5# agrega el user a la base de datos 6db.session.add(user) 7 8# parecido al commit de GIT lo que hace es guardar todos los cambios que hayas hecho 9db.session.commit()
Basta con que digas: db.session.commit()
y todo lo que hayas hecho con tu código se traducirá a código de lenguaje SQL.
El primer paso sería definir nuestro modelo
1class Person(Base): 2 __tablename__ = 'person' 3 # Aquí definimos el nombre de la tabla person. 4 # Ten en cuenta que cada columna es también un atributo normal de primera instancia de Python. 5 id = Column(Integer, primary_key=True) 6 name = Column(String(250), nullable=False) 7 8 # el metodo serialize convierte el objeto en un diccionario 9 def serialize(self): 10 return { 11 "id": self.id, 12 "name": self.name 13 }
¡Todo lo que tiene que hacer es crear un nuevo objeto Person, agregarlo a la sesión de la base de datos y commit!
Simplemente reemplaza <username_value>
y <email_value>
con los valores reales que deseaa agregar, a continuación.
1person = Person(username=<username_value>, email=<email_value>) 2db.session.add(person) 3db.session.commit()
Hay 3 formas para devolver data de la base de datos:
1. Obtén todos los registros de una tabla/modelo en particular usando MyModel.query.all()
2. Obtén un único registro en función de su clave principal mediante MyModel.query.get(id)
3. Obtén un grupo de registros en función de una consulta Person.query.filter_by(arg1=value, arg2=value, ...)
1# aquí es como se buscan todas las personas 2all_people = Person.query.all() 3all_people = list(map(lambda x: x.serialize(), all_people)) 4 5# aquí es como se busca un grupo de personas con name = alex 6all_people = Person.query.filter_by(name='alex') 7all_people = list(map(lambda x: x.serialize(), all_people)) 8 9# aquí es cómo se busca a una persona con id = 3 (solo funciona con las primary key) 10person = Person.query.get(3)
Todo lo que tienes que hacer es seleccionar la instancia de una Persona que te gustaría eliminar (es decir, por su id) y eliminarla escribiendo db.session.delete(person)
.
1person = Person.query.get(3) 2db.session.delete(person) 3db.session.commit()
Para actualizar, primero necesitas devolver/seleccionar el registro de la base de datos, luego puedes actualizar la propiedad que desees y hacer commit nuevamente.
1person = Person.query.get(3) 2person.name = "Bob" 3db.session.commit()
Una transacción es una secuencia de operaciones (como INSERT, UPDATE, SELECT) realizadas en tu base de datos. Para que una transacción esté completa una cierta cantidad de operaciones dentro de un grupo deben ser exitosas. Si una operación falla, toda la transacción falla.
Las transacciones tienen las siguientes 4 propiedades estándar (conocidas como propiedades ACID: español significa Atomicidad, Consistencia, Aislamiento y Durabilidad )
Una transacción termina con COMMIT o ROLLBACK.
El comando COMMIT se usa para guardar de manera permanente los cambios realizados en una transacción dentro de la base de datos.
Cuando usas INSERT, UPDATE o DELETE, los cambios realizados con estos comandos no son permanentes, los cambios hechos pueden desahacerse o "podemos volver atrás".
Pero cuando usas el comando COMMIT los cambios en tu base de datos serán permanentes.
Restaura tu base de datos hasta tu último COMMIT. También puedes usarlo con el comando SAVEPOINT para saltar a un punto que hayas guardado durante una transacción en curso.
Del mismo modo, si usas UPDATE para hacer cambios en tu base de datos, puedes deshacerlos usando el comando ROLLBACK pero sólo si aún no has usado el comando COMMIT de esta forma:
1db.session.rollback()
Este comando se usa para guardar temporalmente una transacción para así poder volver a cierto punto utilizando el comando ROLLBACK si así lo necesitas, puedes usarlo así:
1db.session.begin_nested()
Este comando se puede llamar muchas veces y emitirá un nuevo PUNTO DE CONTROL con una ID.
Digamos que vamos a comer pizza y nuestra pizza tiene tres ingredientes de base: mozzarella, tomate y aceitunas. Nuestra tabla se llamaría 'PIZZA' y se vería de la siguiente manera:
Pero tenemos una lista de ingredientes extra que podemos añadirle: escogemos carne pero luego cambiamos de parecer y queremos champiñones. También nos gustaría añadirle pepperoni y tocino. Veamos como se vería nuestra transacción:
1# we insert a new ingredient into out pizza 2ingredient = Ingredient() 3ingredient.name = 'meat' 4ingredient.id = 4 5db.session.add(ingredient) 6 7# now we COMMIT the transaction and save it into the database 8db.session.commit() 9 10ingredient = Ingredient.query.get(4) 11ingredient.name = mushrooms 12 13# save a checkpoint 14checkpoint_a = db.session.begin_nested() 15 16# add pepperoni 17ingredient = Ingredient() 18ingredient.name = 'pepperoni' 19db.session.add(ingredient) 20 21# one last checkpoint before adding bacon ingredient 22checkpoint_b = db.session.begin_nested() 23 24# add bacon 25ingredient = Ingredient() 26ingredient.name = 'bacon' 27db.session.add(ingredient)
Ahora nuestra 'Pizza' tiene los siguientes ingredientes:
Ahora acabamos de decir que ya no queremos tocino, asi que usamos ROLLBACK:
1ROLLBACK TO B;
y nuestra 'PIZZA' se ve así:
...me ha dado hambre luego de leer esta lección ¿¿tú no tienes hambre??