Sobre Nosotros

Catálogo de contenidos

Para los geeks autodidactas, este es nuestro extenso catálogo de contenido con todos los materiales y tutoriales que hemos desarrollado hasta el día de hoy.

Tiene sentido comenzar a aprender leyendo y viendo videos sobre los fundamentos y cómo funcionan las cosas.

Machine Learning Engineering (16 weeks)

Full-Stack Software Developer

Buscar en lecciones

Aprendizaje social y en vivo

La forma más eficiente de aprender: Únete a una cohorte con compañeros, transmisiones en vivo, sesiones improvisadas de codificación, tutorías en vivo con expertos reales y mantenga la motivación.

De cero a que te paguen como desarrollador, aprende las habilidades del presente y del futuro. Impulsa tu carrera profesional y sé contratado por una empresa tecnológica.

Empezar a programar

← Regresar a lecciones
Editar en Github

Todo lo que necesitas saber sobre SQLAlchemy

¿Qué es SQL Alchemy?
¿Por qué usar un ORM?
  • Por ejemplo:

¿Qué es SQL Alchemy?

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.

¿Por qué usar un ORM?

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.

Por ejemplo:

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.

Revisemos la operación de base de datos más típica

Creando nuestra base de datos

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 }

INSERT: Insertando un registro en la base de datos

¡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()

SELECT: Buscando o recuperando registros

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)

DELETE: Eliminando un registro de la base de datos.

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

UDPATE: Actualizar un registro.

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

Transacciones

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 )

Transactions

Una transacción termina con COMMIT o ROLLBACK.

COMMIT: session.commit()

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.

Comando ROLLBACK

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

Comando SAVEPOINT

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.

SQL

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:

SQL

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:

SQL

Ahora acabamos de decir que ya no queremos tocino, asi que usamos ROLLBACK:

1ROLLBACK TO B;

y nuestra 'PIZZA' se ve así:

SQL

...me ha dado hambre luego de leer esta lección ¿¿tú no tienes hambre??