Guía completa: CRUD de Estudiantes con Flask y PostgreSQL

Esta ruta de aprendizaje te llevará paso a paso a entender y construir una aplicación CRUD (Crear, Leer, Actualizar, Eliminar) utilizando Flask, SQLAlchemy y PostgreSQL, con una interfaz web potenciada por Bootstrap.


1. Estructura del Proyecto

proyecto-estudiantes/
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── routes.py
│   └── templates/
│       ├── layout.html
│       ├── index.html
│       ├── add_student.html
│       └── edit_student.html
├── config.py
├── populate.py
├── .gitignore
└── run.py (opcional)


2. Configuración Inicial

config.py

class Config:
    SQLALCHEMY_DATABASE_URI = 'postgresql://usuario:contraseña@localhost/estudiantes_db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

Reemplaza usuario y contraseña con los de tu PostgreSQL.

__init__.py en app/

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Config

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)
    db.init_app(app)

    from .routes import main
    app.register_blueprint(main)

    return app


3. Modelo: models.py

from . import db

class Estudiante(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(100), nullable=False)
    edad = db.Column(db.Integer)
    carrera = db.Column(db.String(100))


4. Rutas: routes.py

from flask import Blueprint, render_template, request, redirect, url_for
from .models import Estudiante
from . import db

main = Blueprint('main', __name__)

@main.route('/')
def index():
    estudiantes = Estudiante.query.all()
    return render_template('index.html', estudiantes=estudiantes)

@main.route('/add', methods=['GET', 'POST'])
def add_student():
    if request.method == 'POST':
        nombre = request.form['nombre']
        edad = request.form['edad']
        carrera = request.form['carrera']
        nuevo = Estudiante(nombre=nombre, edad=int(edad) if edad else None, carrera=carrera)
        db.session.add(nuevo)
        db.session.commit()
        return redirect(url_for('main.index'))
    return render_template('add_student.html')

@main.route('/edit/<int:id>', methods=['GET', 'POST'])
def edit_student(id):
    estudiante = Estudiante.query.get_or_404(id)
    if request.method == 'POST':
        estudiante.nombre = request.form['nombre']
        edad = request.form['edad']
        estudiante.edad = int(edad) if edad else None
        estudiante.carrera = request.form['carrera']
        db.session.commit()
        return redirect(url_for('main.index'))
    return render_template('edit_student.html', estudiante=estudiante)

@main.route('/delete/<int:id>')
def delete_student(id):
    estudiante = Estudiante.query.get_or_404(id)
    db.session.delete(estudiante)
    db.session.commit()
    return redirect(url_for('main.index'))


5. Plantillas con Bootstrap