CRUD en Flask y MySQL: Gestión de Registros sin ORM

  Resumen

Flask puede integrarse fácilmente con bases de datos como MySQL utilizando una extensión llamada Flask-SQLAlchemy, que proporciona una capa de abstracción para interactuar con bases de datos relacionales.

MySQL es un sistema de gestión de bases de datos muy utilizado que permite almacenar, organizar y gestionar grandes volúmenes de datos de manera eficiente. Flask, junto con MySQL, ofrece una forma sencilla de implementar operaciones de base de datos en aplicaciones web.

Configuración Inicial con MySQL

Podemos utilizar directamente los drives MySQL Connector o pymysql para interactuar con la base de datos.

Primero, instala pymysql para interactuar directamente con MySQL:

bash
pip install pymysql

Conectar a MySQL en Flask

Vamos a conectar la aplicación Flask directamente a la base de datos MySQL utilizando pymysql.

Modificamos la configuración en app.py

python
import pymysql
from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)

# Conexión a la base de datos MySQL
def obtener_conexion():
  return pymysql.connect(
      host="localhost",
      user="tu_usuario",
      password="tu_contraseña",
      db="db_name",
      cursorclass=pymysql.cursors.DictCursor
  )

CRUD usando MySQL sin ORM

1. Crear (Insertar) Registro

python
@app.route('/crear', methods=['GET', 'POST'])
def crear_usuario():
  if request.method == 'POST':
      nombre = request.form['nombre']
      email = request.form['email']
      conexion = obtener_conexion()
      with conexion.cursor() as cursor:
          sql = "INSERT INTO usuarios (nombre, email) VALUES (%s, %s)"
          cursor.execute(sql, (nombre, email))
      conexion.commit()
      conexion.close()
      return redirect(url_for('listar_usuarios'))
  return render_template('crear_usuario.html')

2. Leer (Listar) Registros

python
@app.route('/')
def listar_usuarios():
  conexion = obtener_conexion()
  with conexion.cursor() as cursor:
      cursor.execute("SELECT * FROM usuarios")
      usuarios = cursor.fetchall()
  conexion.close()
  return render_template('listar_usuarios.html', usuarios=usuarios)

3. Actualizar Registro

python
@app.route('/editar/<int:id>', methods=['GET', 'POST'])
def editar_usuario(id):
  conexion = obtener_conexion()
  if request.method == 'POST':
      nombre = request.form['nombre']
      email = request.form['email']
      with conexion.cursor() as cursor:
          sql = "UPDATE usuarios SET nombre = %s, email = %s WHERE id = %s"
          cursor.execute(sql, (nombre, email, id))
      conexion.commit()
      conexion.close()
      return redirect(url_for('listar_usuarios'))
  
  # Cargar datos del usuario actual
  with conexion.cursor() as cursor:
      cursor.execute("SELECT * FROM usuarios WHERE id = %s", (id,))
      usuario = cursor.fetchone()
  conexion.close()
  return render_template('editar_usuario.html', usuario=usuario)

4. Eliminar Registro

python
@app.route('/eliminar/<int:id>', methods=['POST'])
def eliminar_usuario(id):
  conexion = obtener_conexion()
  with conexion.cursor() as cursor:
      cursor.execute("DELETE FROM usuarios WHERE id = %s", (id,))
  conexion.commit()
  conexion.close()
  return redirect(url_for('listar_usuarios'))

Formularios y Plantillas HTML

Formulario para Crear y Editar Usuario, el mismo formulario sirve tanto para crear como para editar un usuario.

  • crear_usuario.html y editar_usuario.html:
html
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Crear/Editar Usuario</title>
</head>
<body>
  <h1>{{ 'Crear' if not usuario else 'Editar' }} Usuario</h1>
  <form method="POST">
      <div>
          <label for="nombre">Nombre:</label>
          <input type="text" name="nombre" value="{{ usuario.nombre if usuario else '' }}" required>
      </div>
      <div>
          <label for="email">Email:</label>
          <input type="email" name="email" value="{{ usuario.email if usuario else '' }}" required>
      </div>
      <div>
          <input type="submit" value="Guardar">
      </div>
  </form>
  <a href="{{ url_for('listar_usuarios') }}">Volver a la lista</a>
</body>
</html>

Lista de Usuarios

listar_usuarios.html:

html
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Lista de Usuarios</title>
</head>
<body>
  <h1>Usuarios Registrados</h1>
  <table border="1">
      <thead>
          <tr>
              <th>ID</th>
              <th>Nombre</th>
              <th>Email</th>
              <th>Acciones</th>
          </tr>
      </thead>
      <tbody>
          {% for usuario in usuarios %}
          <tr>
              <td>{{ usuario.id }}</td>
              <td>{{ usuario.nombre }}</td>
              <td>{{ usuario.email }}</td>
              <td>
                  <a href="{{ url_for('editar_usuario', id=usuario.id) }}">Editar</a> |
                  <form action="{{ url_for('eliminar_usuario', id=usuario.id) }}" method="POST" style="display:inline;">
                      <button type="submit">Eliminar</button>
                  </form>
              </td>
          </tr>
          {% endfor %}
      </tbody>
  </table>
  <a href="{{ url_for('crear_usuario') }}">Crear nuevo usuario</a>
</body>
</html>

Ejemplos de CRUD con Flask y MySQL

A continuación, te comparto dos ejemplos prácticos de CRUDs completos que pueden servirte de referencia para tus proyectos con Flask y MySQL:

  • CRUD con Flask, Python y MySQL
    Este repositorio contiene un ejemplo básico de cómo crear un CRUD utilizando Flask y MySQL, ideal para aprender las operaciones fundamentales como crear, leer, actualizar y eliminar registros.

  • CRUD Completo con Python, MySQL y un Dashboard
    En este ejemplo, se muestra un CRUD más avanzado que incluye la integración con un dashboard, lo que lo hace perfecto para proyectos que requieren una interfaz más completa para gestionar la base de datos.