CRUD de MongoDB y Python con PyMongo

CRUD (create, read, update, delete) en Python y MongoDB

Siguiendo con la serie de tutoriales para consumir distintas bases de datos hoy veremos cómo conectarnos a una base de datos de MongoDB y hacer todas las operaciones para crear, leer, actualizar y eliminar desde Python.

CRUD de MongoDB y Python con PyMongo
CRUD de MongoDB y Python con PyMongo

El módulo que usaremos será PyMongo; el cual está disponible para instalarse por medio de Python y que nos permite conectarnos a MongoDB, obtener bases de datos, colecciones y todo lo relacionado a ello.

Al finalizar podremos gestionar una colección de productos de una tienda.

Requisitos y recomendaciones

Asegúrate de tener instalado Python y PIP, así como MongoDB. Igualmente te recomiendo instalar un administrador de MongoDB: Robo 3T. Finalmente, crea algunos usuarios para gestionar tu instalación de MongoDB; por seguridad.

Otros posts que tal vez quieras leer:

Instalar librería

Una vez que tengas instalado pip, ejecuta lo siguiente en tu terminal:

python -m pip install pymongo

Espera a que se termine de instalar y con eso tenemos

¿Por qué usar Robo 3T?

Con los ejemplos que iremos viendo, es muy útil una herramienta que nos permita confirmar si efectivamente nuestros cambios se están haciendo en la base de datos.

Por ejemplo, si programamos el método para insertar datos, ¿cómo sabemos si se insertaron, si todavía no hemos programado la parte para listarlos?

Para eso es que usamos la herramienta, ya que con ella puedes ir viendo cómo está tu base de datos. Recuerda que dejé un link a la instalación allá arriba.

Conectar a MongoDB desde Python: obtener base de datos

Para crear una nueva conexión, instanciamos a MongoClient pasándole las credenciales y los datos necesarios como el host, puerto y nombre de la base de datos. Hay otras maneras, pero esta es la que recomiendo porque nos permite cambiar fácilmente cualquier dato.

Todo eso podemos encerrarlo en una función como la que se ve a continuación:

Por cierto, en mi caso me conecto a la base de datos tienda (que tiene la colección productos), pero es para ejemplificar.

Una nota sobre el usuario y la contraseña

Cuando conectamos a PHP con MongoDB usamos rawurlencode para codificar el usuario y contraseña para que fueran seguros al viajar como una URL, es decir, codificar caracteres especiales como / o @, si tu usuario o contraseña son así, entonces primero codifícalos. Importa el módulo

import urllib.parse

Para luego usar a quote:

pass = urllib.parse.quote("La contraseña con caracteres complejos")

Y listo, no lo incluí en el tutorial porque sería más confuso y largo. No olvides hacer lo mismo con el nombre de usuario.

La clase

Vamos a usar una clase para simplificar las cosas. Tranquilo, no es Java y su obligación de la POO; es una simple clase que representa a un producto:

Esto nos permitirá crear objetos de tipo Producto para pasarlos a los siguientes métodos de insertar y actualizar. No es obligatorio, pero así lo haremos.

Insertar o crear datos en MongoDB desde Python 3

Comencemos por insertar datos; de nuevo lo digo, lo encerramos en una función que recibe un objeto de tipo producto.

Para insertar un dato, primero obtenemos la colección que se encuentra dentro de nuestra base de datos, y llamamos al método insert_one.

A ese método le pasamos un diccionario con las claves y valores que queremos insertar.

Lo que devuelve nuestra función es el id insertado; no estamos obligados a hacerlo pero permite saber si realmente se insertó o no.

Obtener datos de una colección de MongoDB a través de Python 3

Para esto, las colecciones nos dan un método o función llamada find, así como se hace normalmente en la CLI de MongoDB.

Si no le pasamos un criterio de búsqueda, devolverá todo lo existente. Más tarde, a esto podemos iterarlo con un ciclo foreach, pero primero veamos a la función:

Cuando llamamos al método obtener, podemos iterar los productos. Cabe mencionar que accedemos a sus propiedades a través de producto[clave], por ejemplo producto["precio"] en lugar de producto.precio.

Actualizar dato de MongoDB con PyMongo

Para actualizar un valor, llamamos al método update_one que recibe dos argumentos: el criterio de búsqueda (es decir, la condición que deben cumplir los datos para que se actualicen) y el nuevo valor.

El código queda así:

Recibe el id del producto que se va a actualizar, y un producto que tiene los nuevos datos, o sea, los que se pondrán al actualizar.

Lo que regresa la función es el número de documentos actualizados; si no cambiamos ningún valor entonces devolverá cero, porque no hubo cambios. Para saber por qué usamos ObjectId o $set sigue leyendo.

¿Establecer o remplazar?

Aquí hay que ver algo muy importante, y es que como segundo argumento recibe el documento que será el remplazo del anterior. Si solamente queremos actualizar algunos datos, usamos el selector $set para establecer las propiedades necesarias, en lugar de remplazar todo el documento.

Al usar $set, si no indicamos una nueva propiedad o nuevo valor, los demás valores se quedan intactos. Si quieres remplazar el documento, entonces simplemente manda el diccionario en lugar de usar un selector de tipo $set.

El ObjectId

Aunque el ID es una cadena aleatoria, para hacer búsquedas a partir del mismo, debemos crear un objeto de tipo ObjectId, pasándole a la cadena que tiene el id como argumento. Esto es necesario siempre que filtremos por ID, ya sea para eliminar, actualizar, buscar o listar.

Eliminar datos de una colección en MongoDB

Ahora veamos el método que elimina, es más simple pues sólo recibe un id del producto que vamos a eliminar. Queda así:

Usamos de nuevo el ObjectId para el criterio de selección. Lo que devuelve la función es el número de documentos eliminados.

Ejemplo de uso con PyMongo y MongoDB

Para ejemplificar todo y poner todo junto de una manera funcional, podemos crear un menú que se imprima por consola, lea la elección del usuario y dependiendo de ello inserte uno, actualice, elimine o consulte.

Aquí puedes leer sobre print e input en Python. Todo el código (recuerda que aparte está la clase, que vive en un archivo llamado producto.py y que tiene el código que está más arriba) queda de la siguiente manera:

Recuerda que es un simple ejemplo, no es para usarse en la vida real.

Conclusión

Te invito a leer la documentación oficial para indagar más sobre el tema de Python y MongoDB:

https://api.mongodb.com/python/current/

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

1 comentario en “CRUD (create, read, update, delete) en Python y MongoDB”

  1. Pingback: Instalar Python 3 y pip en Android usando Termux - Parzibyte's blog

Dejar un comentario