Construyendo un sistema educativo en Python (POO) conectado a MySQL — Desde cero
MasTalentos — 2026-04-21
Crear un sistema real no es solo “conectar y ya”. Si lo haces bien desde el inicio, te queda una base sólida para escalar, mantener y hasta convertirlo en producto.
En esta publicación vamos a construir un mini sistema educativo con:
Python + POO
MySQL como base de datos
Separación por capas (modelo, servicio, configuración)
Código completo: https://github.com/BrayanAngaritaR/education_project
1. ¿Qué vamos a construir?
Un sistema simple donde:
Existen Estudiantes
Existen Cursos
Un estudiante puede inscribirse en cursos
2. Instalación de dependencias
Primero activa el entorno virtual ejecutando estos dos comandos:
python3 -m venv venv
source venv/bin/activateAhroa, instala el conector oficial de MySQL. Abre la terminal en Visual Studio Code o un editor de texto de preferencia y ejecuta:
pip install mysql-connector-python3. Base de datos (MySQL)
Usando una herramienta con motor de base de datos como XAMPP o TablePlus vamos a ejecutar el siguiente comando.

En TablePlus simplemente presionamos en el ícono de la base de datos ⛁ y creamos la base de datos. La seleccionamos y mediante el botón SQL abrimos el editor de SQL.
Luego, pegamos el código que se encuentra debajo.
CREATE DATABASE education_system;
USE education_system;
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE courses (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100)
);
CREATE TABLE enrollments (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
course_id INT,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);4. Estructura del proyecto
Crea los siguientes archivos en este orden
📁 education_project/
│
├── 📁 config/
│ └── 📄 database.py
│
├── 📁 models/
│ ├── 📄 student.py
│ └── 📄 course.py
│
├── 📁 services/
│ ├── 📄 student_service.py
│ └── 📄 course_service.py
│ └── 📄 enrollment_service.py
│
└── 📄 main.py5. Conexión a MySQL (POO)
📁 config/database.py
import mysql.connector
class Database:
def __init__(self):
self.connection = None
def connect(self):
self.connection = mysql.connector.connect(
host="localhost", #Si estás en tu computador, déjalo así
user="root", # Usuario por defecto en la BD
port=3306, # Puerto por defecto
password="123456", # Contraseña de tu BD
database="education_system" # Nombre de tu base de datos
)
print("✅ Conectado a MySQL")
def get_connection(self):
return self.connection
def close(self):
if self.connection:
self.connection.close()
print("🔌 Conexión cerrada")6. Modelos (POO puro)
📁 models/student.py
class Student:
def __init__(self, id, name, email):
self.id = id
self.name = name
self.email = email📁 models/course.py
class Course:
def __init__(self, id, title):
self.id = id
self.title = title7. Servicios (lógica + base de datos)
📁 services/student_service.py
from models.student import Student
class StudentService:
def __init__(self, db):
self.db = db
def create_student(self, name, email):
conn = self.db.get_connection()
cursor = conn.cursor()
cursor.execute(
"INSERT INTO students (name, email) VALUES (%s, %s)",
(name, email)
)
conn.commit()
cursor.close()
def get_students(self):
conn = self.db.get_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT * FROM students")
rows = cursor.fetchall()
students = []
for row in rows:
students.append(Student(row['id'], row['name'], row['email']))
cursor.close()
return students📁 services/course_service.py
from models.course import Course
class CourseService:
def __init__(self, db):
self.db = db
def create_course(self, title):
conn = self.db.get_connection()
cursor = conn.cursor()
cursor.execute(
"INSERT INTO courses (title) VALUES (%s)",
(title,)
)
conn.commit()
cursor.close()
def get_courses(self):
conn = self.db.get_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute("SELECT * FROM courses")
rows = cursor.fetchall()
courses = []
for row in rows:
courses.append(Course(row['id'], row['title']))
cursor.close()
return courses8. Inscripciones (relación)
Podemos crear un servicio adicional:
📁 services/enrollment_service.py
class EnrollmentService:
def __init__(self, db):
self.db = db
def enroll(self, student_id, course_id):
conn = self.db.get_connection()
cursor = conn.cursor()
cursor.execute(
"INSERT INTO enrollments (student_id, course_id) VALUES (%s, %s)",
(student_id, course_id)
)
conn.commit()
cursor.close()9. Ejecución del sistema
Ejecuta:
python main.py y el sistema iniciará. Si te sale error con el comando python y estás usando Mac, ejecuta en la terminal el siguiente comando para corregirlo:
alias python=python3📁 main.py
from config.database import Database
from services.student_service import StudentService
from services.course_service import CourseService
from services.enrollment_service import EnrollmentService
db = Database()
db.connect()
student_service = StudentService(db)
course_service = CourseService(db)
enrollment_service = EnrollmentService(db)
# Crear datos
student_service.create_student("Brayan", "brayan@email.com")
course_service.create_course("POO en Python")
# Obtener datos
students = student_service.get_students()
courses = course_service.get_courses()
# Inscribir estudiante en curso
enrollment_service.enroll(students[0].id, courses[0].id)
print("🎓 Sistema funcionando correctamente")
db.close()Al terminar la ejecución, deberías ver algo como esto:
(venv) brayanangaritar@MacBook-Pro education_project % python main.py
✅ Conectado a MySQL
🎓 Sistema funcionando correctamente
🔌 Conexión cerrada10. ¿Qué aprendiste realmente?
Este ejemplo no es trivial. Aquí ya aplicaste:
Programación Orientada a Objetos
Separación por capas
Inyección de dependencias
Manejo básico de base de datos
Relaciones entre entidades
11. Errores comunes
Mezclar SQL dentro del
main.pyNo cerrar conexiones
No usar
commit()Hardcodear (dejar en el código) las credenciales.