BD PostgreSQL

Python y PostgreSQL: ejemplo de conexión y CRUD

En este post vamos a ver cómo conectar Python con el motor de base de datos PostgreSQL usando el módulo psycopg2 que cumple con la DB API 2.0.

La DB API 2.0 es una API común en la que se utilizan los mismos métodos, cambiando únicamente el driver; algo así como PDO en PHP.

Python y PostgreSQL – Ejemplo de conexión usando psycopg2

Vamos a hacer un CRUD con PostgreSQL usando Python, evitando inyecciones SQL.

Nota: todo el código está en mi GitHub.

Requisitos y recomendaciones

Recuerda instalar Python y PIP en Linux o Windows, y también PostgreSQL en Windows o Linux.

Recomiendo crear un usuario y base de datos para este ejercicio, o tener credenciales a la mano.

Una vez que tengas PIP, ejecuta lo siguiente para instalar Psycopg2:

pip install psycopg2

Dentro del código vamos a encontrar el archivo credenciales_ejemplo.json, el cual debemos copiar y renombrar a credenciales.json y dentro del mismo debemos poner los datos de acceso.

De esta manera puedes compartir tu código sin necesidad de pasar tus contraseñas y usuarios.

Base de datos y tabla

La base de datos se llama mascotas, y la tabla igualmente mascotas.

El esquema es el siguiente:

See the gist on github.

Vamos a trabajar con un tipo de dato autoincrementable para el id, además de guardar el nombre y la edad.

Conexión

Vamos a poner lo relacionado a la conexión en un archivo llamado bd.py que tendrá la variable conexion, y después vamos a importar a la misma desde otros archivos.

See the gist on github.

No te confundas con las credenciales. El mismo código podría quedar así:

See the gist on github.

Solo que con la primera forma ponemos las credenciales en un archivo separado, no en el código.

Prueba ejecutando el archivo, no debería generar ningún error. Si es así, podemos continuar.

Insertar (insert)

Comenzamos importando a conexion del archivo bd.

Para insertar tenemos que obtener un cursor y cerrarlo al terminar.

Cuando tenemos un cursor, podemos llamar al método execute con dos argumentos: la consulta como cadena, y una tupla con los valores que remplazarán a los %s.

Si te fijas, estamos evitando inyecciones SQL al usar placeholders en lugar de concatenar. Y aunque se parece mucho al formato para printf del viejo lenguaje C, siempre debes poner %s sin importar el tipo de dato.

See the gist on github.

Precaución: cuando solo mandamos un dato, debemos poner una coma al final. Es decir, si solo insertamos el nombre, la tupla sería:

(nombre,)

La coma al final es muy importante, pues así Python sabe que es una tupla. Si lo quitamos:

(nombre)

Lo tomará como que estamos evaluando entre paréntesis el valor, y mandará el valor solo, no en una tupla, lo que generará errores. Es decir, (nombre) se convierte en simplemente nombre.

Otro aspecto importante es usar with, ya que de esta manera el cursor se cierra automáticamente al terminar.

Finalmente, para que los cambios se guarden, debemos llamar a conexion.commit() siempre que cambiemos los datos.

Listar (select)

Para consultar a todos los valores y tenerlos dentro de un arreglo obtenemos igualmente un cursor, invocamos a execute con la consulta y después invocamos a cursor.fetchall()

Este método no es el más óptimo pero trae los datos en un arreglo, cosa sencilla:

See the gist on github.

En cada iteración tenemos a la fila en forma de lista, y podemos acceder a sus elementos a través del índice, por ejemplo, mascota[0].

Consultar con un cursor

El método de iterar con un cursor es más óptimo al recorrer grandes cantidades de datos, pues no guardamos las filas en un arreglo, sino que traemos una por una a la vez.

El siguiente código ejemplifica cómo consultar datos usando un cursor:

See the gist on github.

Ahora no tenemos los datos en un arreglo, sino que traemos de a uno por uno con fetchone. El ciclo se cumplirá hasta que fetchone regrese algo que no se evalúe como True, por ejemplo, None.

Consultar usando where

Las consultas también pueden tener datos que debemos escapar para evitar inyecciones SQL. El siguiente ejemplo hace una consulta usando una condición:

See the gist on github.

Está de más recordar que esas variables pueden venir de cualquier otro lugar, aquí las estoy poniendo directamente en el código para hacer las cosas más sencillas.

Consultar usando like

El método de búsqueda por coincidencia en donde se usa like es un poco complejo cuando hablamos de inyecciones SQL, ya que a veces se necesita concatenar con los signos de porcentaje o comodines.

Para hacer este tipo de búsqueda hay que poner un simple placeholder, y concatenar la búsqueda con los signos de porcentaje:

See the gist on github.

Editar (update)

Para actualizar un dato usamos de nuevo un cursor con el método execute e invocamos al método commit de la conexión.

Los argumentos se pasan como placeholders y se envían como tupla, justo como se hace al insertar.

See the gist on github.

Eliminar (delete)

El código para eliminar sigue las mismas reglas que el de actualizar e insertar.

Recuerda que se pueden pasar cualquier número de argumentos, siempre y cuando los indiques con placeholders. También podrías no pasar argumentos.

Finalmente, no olvides hacer un commit.

See the gist on github.

Las excepciones

En todo el código estoy atrapando cualquier excepción de psycopg2.Error, es importante manejarlas ya que así evitas mostrar errores o generar más de los mismos.

No intentes cachar una excepción global con Exception, pues cualquier error del código (aunque no sea de la base de datos) se tomará como error de la base de datos, aunque no tenga nada que ver con la misma, generando confusión.

Conclusión

Hemos visto cómo conectar Python con PostgreSQL a través del módulo psycopg2.

Sé que son ejemplos sencillos, pero lo hago de esta forma para no complicar el código con cosas que no tienen que ver con el objetivo: mostrar cómo hacer un CRUD con Python y PSQL.

Obviamente los datos pueden venir de otro lugar, se pueden separar los componentes, etcétera; todo lo puedes acomodar a tu modo.

Te invito a leer más sobre Python o PostgreSQL.

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

JavaScript (lado del cliente): leer pixeles de imagen

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

5 días hace

PHP y JavaScript: llenar select con AJAX

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

5 días hace

Imprimir PDF generado con HTML

Hoy vamos a ver programar la impresión de un PDF generado a partir de HTML…

7 días hace

JavaScript: llenar select con arreglo

En este tutorial básico de JavaScript con HTML vamos a ver cómo llenar una lista…

2 semanas hace

Imprimir PDF a partir de URL

En este artículo se presenta una guía para imprimir un PDF a partir de una…

2 semanas hace

Imprimir PDF a partir de base64

En este post voy a enseñarte cómo imprimir un PDF a partir de su representación…

2 semanas hace

Esta web usa cookies.