# PROGRAMAR un simple y minimalista CRUD de acceso a datos con Python ## TAREAS : - [X] traducidos los ficheros Java a Python scripts con funcionalidad equivalente (acceso a SQLite por un lado y a MongoDB por el otro ) - [ ] Testear / debug ? - [ ] incorporar el uso de la librería Python 'Faker' (ver a continuación) para poblar las bases de datos con datos 'falsos' para test. ## Recetas y pócimas Python - [Uso de entornos virtuales mágicos](https://pythonisas.github.io/Pythonisas/entornos-virtuales-en-python.html) - [Para tus bases de datos ...¿Generar datos de prueba aleatoriamente?](https://pythonisas.github.io/Pythonisas) ## Recursos ### En particular sobre la cuestión python + SQLite / mongoDB : - [programando bases de datos SQLite, artículo del "El Libro de Python"](https://ellibrodepython.com/bases-datos-sqlite-python) ### En general sobre la cuestión : - [Documentación Oficial en ES](https://docs.python.org/es/3/) - ["Inventa tus propios juegos de computadora con Python"](https://inventwithpython.com/es/) ## Diagrama de flujo de los scripts Python : La Base de Datos en ambos casos será unas simples tablas de 'alumnos' y 'profesores' siguiendo el patrón de lo programado en los ficheros Java de ejemplo (disponibles en este Proyecto) ``` ╔═══════════════════════════════════╗ ║ CRUD Minimalista con Python 🐍 ║ ╚═══════════════╤═══════════════════╝ │ ┌───────────┴───────────┐ │ TABLAS / Colecciones │ │ ┌─────────┐ ┌──────┐ │ │ │alumnos │ │profes │ │ │ └─────────┘ └──────┘ │ └───────────┬───────────┘ │ ┌────────┴────────┐ │ C reate + R ead │ └────────┬────────┘ │ ┌───────────────┴───────────────┐ │ │ ┌───────┴────────┐ ┌────────┴───────┐ │ EJEMPLO A) │ │ EJEMPLO B) │ │ │ │ │ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │ SQLite │ │ │ │ MongoDB │ │ │ │ .db │ │ │ │ { } │ │ │ └─────┬────┘ │ │ └─────┬────┘ │ │ │ │ │ │ │ │ ◄──►│ │ │ ◄──►│ │ │ │ │ │ │ │ │ ┌─────┴────┐ │ │ ┌─────┴────┐ │ │ │ Python │ │ │ │ Python │ │ │ │ sqlite3 │ │ │ │ pymongo │ │ │ └──────────┘ │ │ └──────────┘ │ └────────────────┘ └────────────────┘ SQL NoSQL (Relacional) (Documentos) ``` ## 📁 Estructura del Proyecto ``` programar-un-simple-y-minimalista-CRUD-de-acceso-a-datos-con-Python\ ├── README.md ← este fichero ├── acceso-a-sqlite-via-java.jar ← ejemplo Java original (SQLite) ├── acceso-a-MongoDB-via-java.jar ← ejemplo Java original (MongoDB) ├── crud_sqlite.py ✅ Ejemplo A — funcional ├── crud_mongodb.py ✅ Ejemplo B — funcional (*) └── dam.db ← BD SQLite generada automáticamente ``` > (*) `crud_mongodb.py` requiere una cadena de conexión a un servidor MongoDB válido (Atlas o local) --- ## EJEMPLO A): SQLite `<->` Python 📄 **Fichero:** `crud_sqlite.py` 🔧 **Dependencias:** ninguna (sqlite3 viene con Python) ```bash python3 crud_sqlite.py ``` ### ✅ Equivalencia Java → Python | **Concepto Java** | **Equivalente Python** | |:---------------------------------------|:------------------------------------------------| | `DriverManager.getConnection(url)` | `sqlite3.connect(db_name)` | | `Statement` / `PreparedStatement` | `cursor.execute()` con `?` placeholders | | `ResultSet` + `rs.next()` | `cursor.fetchall()` + iteración | | `pstmt.setString()` / `pstmt.setInt()` | tupla directa `(valor1, valor2)` | | `try-with-resources` | `try/finally` + `conn.close()` | | INSERT uno a uno con `executeUpdate()` | `executemany()` — inserta todos de una vez | ### 💡 Notas - Python **no necesita driver externo** para SQLite (módulo `sqlite3` incluido en la stdlib) - `executemany()` es más pythónico que insertar fila a fila como en Java - La BD `dam.db` se recrea desde cero en cada ejecución --- ## EJEMPLO B): MongoDB `<->` Python 📄 **Fichero:** `crud_mongodb.py` 🔧 **Dependencias:** `pip install pymongo[srv]` ```bash python3 crud_mongodb.py ``` ### ✅ Equivalencia Java → Python | **Concepto Java** | **Equivalente Python** | |:-----------------------------------------------|:----------------------------------------| | `MongoClients.create(configuracion)` | `MongoClient(CADENA_CONEXION)` | | `baseDatos.runCommand(new Document("ping",1))` | `cliente.admin.command("ping")` | | `clienteMongo.listDatabaseNames()` | `cliente.list_database_names()` | | `baseDatos.listCollectionNames()` | `db.list_collection_names()` | | `coleccion.find()` + bucle de claves | `coleccion.find()` + `doc.items()` | | *(no existía en el Java)* | `$lookup` + `$unwind` (equivale a JOIN) | ### 💡 Notas - La cadena de conexión del Java original (`clusterdam2025.9q7lm`) ya no está activa - Para probar, cambiar `CADENA_CONEXION` por una conexión válida: - **Atlas:** `mongodb+srv://user:pass@cluster.xxxxx.mongodb.net/` - **Local:** `mongodb://localhost:27017` - Se añadió un **`$lookup`** (equivalente a JOIN) que no existía en el Java, para mostrar alumnos con sus profesores — igual que en el ejemplo SQLite - Las colecciones se recrean en cada ejecución (`drop()` + `insert_many()`)