python

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

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:

See the gist on github.

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:

See the gist on github.

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.

See the gist on github.

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:

See the gist on github.

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í:

See the gist on github.

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í:

See the gist on github.

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:

See the gist on github.

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.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Imprimir PDF con Bot de Telegram

La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…

2 días hace

Enviar mensaje con bot de Telegram usando JavaScript (lado del cliente)

Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…

3 días hace

PHP: incrustar imagen en base64

El día de hoy te enseñaré algo muy sencillo pero útil al programar con PHP:…

3 días hace

Plugin ESC POS – Actualización 3.4.0: imprimir HTML

El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…

4 días hace

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

2 semanas hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

2 semanas hace

Esta web usa cookies.