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:

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.

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

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.

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:

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:

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:

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:

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.

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.

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.

1 pensamiento sobre “Python y PostgreSQL: ejemplo de conexión y CRUD”

  1. Pingback: Python 3 y SQLite 3 - Introducción y ejemplos - Parzibyte's blog

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *